Mehrspaltiges Textdokument in 4 Input's schreiben

  • Ich habe ein Textdokument was über mehrere Spalten (umgenau zu sein 4 Spalten) geht und aus Zahlen, Buchstaben und Sonderzeichen besteht.
    Was ich schon versucht habe ist die Buchstaben und Sonderzeichen die auf der Linken Seite stehen zu entfernen.

    Die Textdatei sieht so aus:

    SQL
    Wert1:10,0
    Wert2:214,4
    Wert3:1241
    Wert.4:556.000,00

    Die Spalte mit Wert 1 - Wer4 soll weg sowie die Doppelpunkte und Punkte. Zum Schluss sollen nur noch die Zahlen mit den Punkten und Kommas überbleiben und in 4 Verschiedene Input's geschrieben werden also pro Input eine Zahl. Das Splitten scheitert bei mir schon.

    [autoit]

    $Data = @TempDir&"\Data.txt"
    $read = FileRead($Data)
    StringSplit($read,"A-Z"&".:")

    [/autoit]

    Mit freundlichen Grüßen

    volle

  • Es müsste so funktionieren.
    _StringBetween liefert das Ergebniss zwischen dem Doppelpunkt und dem Zeilenende
    Bei StringSplit ist 'A-Z' scon falsch, da AutoIt nach 'A-Z' sucht und nicht nach 'ABCDEFG...XYZ'

    [autoit]


    #include <String.au3>
    Guicreate('Test',400,200)
    For $n=1 to 4
    $file=FileReadLine(@TempDir&"\Data.txt",$n)
    $str=_StringBetween($file,':','')
    GuictrlCreateInput($str[0],($n-1)*75+50,30,70)
    next
    guisetstate()
    While 1
    $msg=GuigetMsg()
    if $msg=-3 then exit
    wend

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Dann muss man es eben anpassen ;)
    _FileCountLines liefert die Anzahl der Zeilen
    Nun erstellt es für jede Zeile ein Input und passt die GUI automatisch an.
    Sonst noch Wünsche? :P

    [autoit]


    #include <String.au3>
    #include <File.au3>
    Guicreate('Test',_FileCountLines(@TempDir&"\Data.txt")*75+50,200)
    For $n=1 to _FileCountLines(@TempDir&"\Data.txt")
    $file=FileReadLine(@TempDir&"\Data.txt",$n)
    $str=_StringBetween($file,':','')
    GuictrlCreateInput($str[0],($n-1)*75+25,30,70)
    next
    guisetstate()
    While 1
    $msg=GuigetMsg()
    if $msg=-3 then exit
    wend

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]
  • Hallo volle,

    ja was hatte ich bis vor kurzen vor ähnlichen Problemen gestanden wie du. Mit StringLen / StringLeft / StringInStr / StringSplit etc. habe ich die Textzeilen auseinander genommen,
    in vielen Zeilen analysiert bis ich hatte was ich wollte.

    So ein paar "Obercoole" hier hauten dann bei so etwas immer einen Einzeiler mit StringRegEx oder StringRegExReplace raus ....
    nachdem ich mir lange (sehr lange) die Hilfe dazu angeschaut und experimentiert habe - hat es Klick gemacht.

    StringRegEx(Replace) ist nun "mein Freund" :love:

    Und du kannst es in Zukunft leichter machen, wenn StringRegEx auch dein Freund wird. Anbei eine Lösung für dein Problem mit StringRegExReplace.
    Die eine Zeile in der der Befehl vorkommt, darauf kommt es an. Ichhabe mich bemüht es umfangreich zu kommentieren damit du verstehst was passiert.

    [autoit]

    ;Werte zum Testen festlegen
    Dim $aWerte[5] = ["Wert1:10,0", "Wert2:214,4", "Wert3:1241", "Wert.4:556.000,00", "Wert162718:1234,5678"]
    Dim $sTemp ;Zum zwischenspeichern damit du die Zeile so übernehmen kannst

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

    For $i = 0 To UBound($aWerte) - 1 ; wird von 0 zu Anzahl der Werte im Array hochgezählt (-1 weil Anzahl 4, gezählt wird aber 0 bis 3)
    $sTemp = StringRegExpReplace($aWerte[$i],"(?i)[A-Z]+.[0-9]+:","")
    ;StringRegExpReplace sucht etwas in einem String und ersetzt es - und gibt das Ergebnis zurück
    ;Erläuterung des "Pattern"
    ; (?i) = Groß/Kleinschreibung ignorieren
    ; [A-Z] = Buchstaben finden
    ; + = in beliebiger Anzahl
    ; . = falls da, beliebiges anderes Zeichen finden, z.B. Punkt (Punkt heisst beliebiges Zeichen, Punkt wäre \.)
    ; [0-9] = Zahlen finden
    ; + = ebenfalls in beliebiger Anzahl
    ; : = auf jeden Fall einen Doppelpunkt finden
    ; Nach Pattern der Ersatztext
    ; "" = und alles was du gefunden hast ersetzt du durch "nichts"
    MsgBox(0,"Wert" & $i, "Ursprungswert : " & $aWerte[$i] & @CRLF & _
    "Bereinigter Wert: " & $sTemp)
    Next

    [/autoit]

    Ich muss allerdings zugeben, das die Hälfte der Freunschaft auf dem Kauf von RegExBuddy beruht ( http://www.regexbuddy.com/ ) - da kann ich den Urspungstext reinkopieren und dann mit Echtzeit-Vorschau meinen Suchstring zusammenbauen.
    Geht natürlich auch ohne - einfach mal in die Hilfe schauen. Hier findest du ein Tutorial dazu: https://autoit.de/index.php?page…rial#post239231

    BLinz

  • Du brauchst nicht alles kommentieren und mir ein Link zur Hilfedatei schicken. ^^
    Ich bin so gesagt kein Anfänger mehr das ich soviel Kommentare brauche, war lieb gemeint und ich danke dir dafür.^^
    Ich arbeite sonst nur sehr selten mir Strings, deswegen auch die ganzen Probleme.

    Mit freundlichen Grüßen

    volle

  • :S Ich wollte dich nicht als Anfänger darstellen - ich bin Jahrelang ohne RegEx in der Programmierung ausgekommen :)

    Das kommentieren mache ich für Leute wie mich - wie mich vor nicht alzu langer Zeit. Immer habe ich Staunend die Ausdrücke angestarrt und nicht verstanden was da abläuft.

    Das ist dann auch für den nächsten der nach so etwas sucht - was würde ich mich manchmal für das verstehen um ein paar kleine Kommentare freuen 8o