Variable mit Bedingung kürzen

  • Hallo,

    ich bin gerade dabei mich in AutoIT einzufuchsen. Nun bin ich auf ein Problem gestoßen, was ich nicht "sauber" gelöst bekomme.

    Ein Dateiname der 16-Stellig aus numerischen Zeichen (0000001234556456.*) besteht soll gekürzt werden. Dabei können die letzten 5 immer weggestrichen werden. (00000012345.*). Wichtig ist nun, dass ich die letzten Zahlen die nicht null sind, herausgefiltert werden müssen. Dabei variiert die Anzahl an nullen. Also müsste es eine Abfrage sein, die prüft ob die erste Stelle eine 0 ist, wenn ja dann Streichen. Das muss solange passieren, bis die erste Zahl auftaucht die nicht null ist. Wenn die nächste Zahl nicht null ist, soll die Datei verschoben werden.

    Könnte mir jemand dabei helfen ?

    LG Domme

    Einmal editiert, zuletzt von Domme (2. Juni 2010 um 09:58)

  • müsste in etwa so gehn:

    [autoit]


    $zahl = 00003124053
    while (stringleft($zahl, 1) = "0")
    $zahl = stringtrimleft($zahl, 1)
    wend
    msgbox(0,"",$zahl)

    [/autoit]

    is zwar jetz nur ne billige lösung aber es ist ja auch noch früh am morgen :D

  • Anfängerkompatibel^^

    [autoit]

    $zahl = "000031240534453" ;dateiname ist sowieso ein string

    [/autoit][autoit][/autoit][autoit]

    for $i=1 to stringlen($zahl) ;jede einzelne Ziffer vom Stringanfang bis zum Ende
    if stringmid($Zahl,$i,1)<>"0" then exitloop ;wenn diese Ziffer KEINE 0 ist, dann schleife beenden
    next ;so lange, bis Ende des strings erreicht

    [/autoit][autoit][/autoit][autoit]

    $zahl_ohne_fuehrende_nullen=stringtrimleft($zahl,$i-1) ;alle führenden Nullen streichen
    $letzte_5_gestrichen= stringtrimright($zahl_ohne_fuehrende_nullen,5) ;die letzten 5 Ziffern streichen

    [/autoit][autoit][/autoit][autoit]

    ;Cursor auf die Variable setzen und dann in ScIte Shift+Strg+d drücken zeigt eine Messagebox
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$letzte_5_gestrichen' & @lf & @lf & 'Return:' & @lf & $letzte_5_gestrichen) ;### Debug MSGBOX

    [/autoit]
  • Vielen Dank für die schnellen Antworten. Der Quellcode von Andy ersetzt im Prinzip alle meine If Abfragen etc. die ich da mit Mühe und Not reingebasteltet habe ;)
    Vielen Dank

    LG Domme

  • Wobei man betonen sollte, daß das "Problem" mit einer einzigen Zeile zu erschlagen wäre....so man denn fit in regulären Ausdrücken ist....
    Einer meiner alten Profs pflegte zu sagen: "Das lernen wir dann im 12. Semester!" (Übersetzt: "Braucht kein Mensch wirklich!"));)

  • Fortgeschrittenenkompatibel^^

    [autoit]

    $sDateiName = "00001234567812345.abc"
    $aRegExp = StringRegExp($sDateiName, "0*(\d+)\d{5}", 1)
    ConsoleWrite($aRegExp[0] & @CRLF)
    ;Erklärung zu: "0*(\d+)\d{5}"
    ;0*: findet alle Nullen
    ;(\d+): \d+ findet alle Zahlen, da es in Klammer gesetzt ist, wird nur dieser Teil zurückgegeben
    ;\d{5}: findet genau 5 Zahlen
    ;d.h.: es wird nach beliebig vielen Nullen gesucht, die von beliebig vielen Zahlen gefolgt werden, denen wiederum genau 5 Zahlen folgen.
    ;und da "beliebig viele Zahlen" in Klammer gesetzt ist, werden nur diese ausgegeben...

    [/autoit]

    bzw. um gleich den vollen Dateinamen zu erhalten incl. Extension:

    [autoit]

    $sDateiName = "00001234567812345.abc"
    $sNeu = StringRegExpReplace($sDateiName, "0*(\d+)\d{5}", "\1")
    ConsoleWrite($sNeu & @CRLF)

    [/autoit]
  • NERD-Kompatibel :o)

    [autoit]

    $string="000001203456789"
    $ergebnis=stringtrimright(StringFormat("%d",$string),5)
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$ergebnis' & @lf & @lf & 'Return:' & @lf & $ergebnis) ;### Debug MSGBOX

    [/autoit]

    Eben gerade gefunden:

    Zitat von George

    String Regular Expressions are very powerfull and should be used when required but I do not advocate their abuse. That is, using them when a simple String function will do the job.

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (3. Juni 2010 um 08:17)