Aus txt Zeilen auslesen

  • Hi,

    ich habe folgendes Problem und habe keine Ahnung wie ich das realisieren kann, hoffe ihr könnt mir helfen :)

    Ich hab eine sehr lange Text datei im format .txt. Diese enthält Werte. Diese Werte sind mitunter sehr ähnlich. Jeder Wert enthält mehrere "/" sowie punkte und Doppelpunkte, könnte mitunter auch "-" enthalten, aber eher selten! (nicht immer an der gleichen stelle"). Die Werte haben unterschiedliche Längen und in jeder Zeile steht genau ein wert.

    Ich brauche also ein Programm, wo man selbst die Textdatei auswählen kann. (Soweit komm ich selbst :D xD)
    Dann soll man zwei parameter eingeben können nach dem es die Text datei sucht. Die Parameter stehen aber nicht nebeneinander! Und sind getrennt.
    Die Datei enthält mehrere ähnliche zeilen, die durch die Parameter rausgesucht werden sollen und kopiert und in eine neue text dateigeschrieben werden.

    Also z.b:
    alle zeilen auslesen die hier im Bsp die Parameter def und no enthalten

    Code
    1: a:bc/def/ghij:klmno.qr.st1
    2: x:nbvdc/def/gtwj:klmno.qsdfr.st06
    3: g:nherc/def/gewij:v32na.nbvstsdf63
    4: ztr:ddc/def/gsdij:ksddffno.qwergdf.st91
    5: hgf:ac/ddf/ghij:mvbretno.qrarewq.st

    Zahlen am anfang dienen nur der veranschaulichung!
    Am ende soll er dann jetzt in dem Bsp die zeilen 1,2 und 4 in eine neue text datei schreiben. Und immer die ganze Zeile!

    Code
    1: a:bc/def/ghij:klmno.qr.st1
    2: x:nbvdc/def/gtwj:klmno.qsdfr.st0
    4: ztr:ddc/def/gsdij:ksddffno.qwergdf.st91

    Ich hoffe ihr könnt mir hierbei helfen! Ich hab nämlich keine ahnung wie ich das angehen soll. Meine Kenntnisse reichen dafür leider nicht aus!

    Gruß
    Sheppart

    Einmal editiert, zuletzt von sheppard (12. Mai 2011 um 17:44)

  • [autoit]


    _filereadtoarray() ; liest datei Zeilenweise in ein Array
    _arrayfindall() ; liefert alle indizes/Zeilennummern zurück in denen z.B. Parameter 1 also "def" vorkommt
    ; danach prüfst du die array werte der felder die gefunden wurden noch mit
    stringinstr()
    ;nach dem 2. Parameter
    ;wird der 2. Parameter auch gefunden speicherst du den Zeilen Inahlt z.B. mit
    _arrayadd()
    ;in ein ergebnis array.
    ;Zum schluss schreibst du mit
    _filewritefromarray()
    ;das ergebnis array in eine Datei

    [/autoit]
  • <-- Hat heute frei und nichts zu tun...

    Spoiler anzeigen
    [autoit]

    Global $sFilePath, $sText, $sKeyWords, $aKeyWords
    Global $aMatched

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

    ; Datei auswählen
    $sFilePath = FileOpenDialog("Datei auswählen", "", "Textdateien (*.txt)")
    If @error Then Exit MsgBox(16, "", "Abbruch")

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

    ; Schlüsselwörter eingeben lassen
    $sKeyWords = InputBox("", "Schlüsselwörte bitte mit KOMMA getrennt eingeben")
    $aKeyWords = StringSplit($sKeyWords, ",")
    If @error Then Exit MsgBox(16, "", "Abbruch")

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

    ; Textdatei auslesen
    $sText = FileRead($sFilePath)
    $aMatched = StringRegExp($sText, "(?m)^(.*\Q" & $aKeyWords[1] & "\E.*\Q" & $aKeyWords[2] & "\E.*)$", 3)
    If @error Then Exit

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

    ; Neuen Text zusammenstellen
    $sText = ""
    For $i = 0 To UBound($aMatched) - 1
    $sText &= $aMatched[$i] & @LF
    Next

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

    $sFilePath = FileSaveDialog("Speichern", "", "Textdateien (*,txt)", Default, "Ergebnis.txt")
    If @error Then Exit
    FileDelete($sFilePath)
    FileWrite($sFilePath, $sText)

    [/autoit]
  • wow danke SEuBo :)

    Werds nachher mal ausprobieren und rückmeldung geben :)


    EDIT: Funktioniert perfekt! Danke :) :) :)

    Einmal editiert, zuletzt von sheppard (12. Mai 2011 um 17:43)

  • SEuBo: wenn no vor def kommt, funzt dein Beispiel nicht!

    Gruß,
    UEZ

    Stimmt, danke für den Tipp!
    Hier ein eleganterer Regexp:

    [autoit]

    $aMatched = StringRegExp($sText, "(?m)^(.*(?(?=" & $aKeyWords[1] & ")\Q" & $aKeyWords[1] & "\E.*\Q" & $aKeyWords[2] & "\E.*$|.*" & $aKeyWords[2] & ".*\Q" & $aKeyWords[1] & "\E.*))", 3)

    [/autoit]
    Spoiler anzeigen
    [autoit]

    Global $sFilePath, $sText, $sKeyWords, $aKeyWords
    Global $aMatched

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

    ; Datei auswählen
    $sFilePath = FileOpenDialog("Datei auswählen", "", "Textdateien (*.txt)")
    If @error Then Exit MsgBox(16, "", "Abbruch")

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

    ; Schlüsselwörter eingeben lassen
    $sKeyWords = InputBox("", "Schlüsselwörte bitte mit KOMMA getrennt eingeben")
    $aKeyWords = StringSplit($sKeyWords, ",")
    If @error Then Exit MsgBox(16, "", "Abbruch")

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

    ; Textdatei auslesen
    $sText = FileRead($sFilePath)
    $aMatched = StringRegExp($sText, "(?m)^(.*(?(?=" & $aKeyWords[1] & ")\Q" & $aKeyWords[1] & "\E.*\Q" & $aKeyWords[2] & "\E.*$|.*" & $aKeyWords[2] & ".*\Q" & $aKeyWords[1] & "\E.*))", 3)
    If @error Then Exit

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

    ; Neuen Text zusammenstellen
    $sText = ""
    For $i = 0 To UBound($aMatched) - 1
    $sText &= $aMatched[$i] & @LF
    Next

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

    $sFilePath = FileSaveDialog("Speichern", "", "Textdateien (*,txt)", Default, "Ergebnis.txt")
    If @error Then Exit
    FileDelete($sFilePath)
    FileWrite($sFilePath, $sText)

    [/autoit]

    LG