Gewünschte Passagen aus Text-File löschen

  • Hallo zusammen!

    Das hier ist mein erster Post, also habt bitte Rücksicht mit mir ;)

    Ich habe folgendes Projekt vor:
    - Ein ASCII File wird eingelesen
    - gewünschte Abschnitte (vorher definiert) werden gelöscht
    - Neues bzw. reduziertes ASCII File wird ausgegeben

    Ein-/Ausgabe ist kein Problem, aber beim löschen habe ich keinen Plan, wie ich das angehen soll.

    Die Absätze haben alle die gleiche Formatierung und sind durch die konstanten Strings "/begin xyz" und "/end xyz" begrenzt. Jeweils 2 Zeilen nach "/begin xyz" steht der Name des Absatzes. (siehe Ende d. Posts)

    Es sollen dabei alle Absätze geprüft werden. Ist der Name nicht als Ausnahme definiert, so soll diese gelöscht werden oder alternativ durch Leerzeilen ersetzt werden.

    Der restliche Text bleibt unberührt.


    Ich würde mich über jeden Tipp freuen :)

    Und schonmal Danke im Voraus, für jeden, der sich die Mühe macht und versucht das zu verstehen :D

    MfG Prankster


    Einmal editiert, zuletzt von prankster (26. September 2012 um 22:37)

  • Hier auf die Schnelle gemacht.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <String.au3>
    $file = FileOpen("file.txt", 0)
    $inhalt = FileRead($file)

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

    Dim $aunahmearray[2] = ["Name_Absatz1", "Name_Absatz3"]

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

    $array = StringSplit($inhalt, "/begin xyz", 3)

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

    Dim $final

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

    For $element In $array
    $check = 0
    If StringInStr($element, "/end xyz") Then
    For $element2 In $aunahmearray
    If StringInStr($element, $element2, 3) Then
    $check = 1
    ExitLoop
    EndIf
    Next

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

    If $check = 0 Then
    $final = $final & "/begin xyz" & @CRLF & $element
    Else
    $split = StringSplit($element, "/end xyz", 3)
    $final = $final & $split[1]
    EndIf
    Else
    $final = $final & $element
    EndIf
    Next

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

    FileWrite("final.txt", $final)

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

    • Offizieller Beitrag

    Auch mal auf die Schnelle, nur etwas anders, denn viele Wege führen nach Rom :D

    Spoiler anzeigen
    [autoit]

    $sFile = _
    "Textzeile" & @CRLF & _
    "Textzeile" & @CRLF & _
    "Textzeile" & @CRLF & _
    "Textzeile" & @CRLF & _
    " ..." & @CRLF & _
    "" & @CRLF & _
    "/begin xyz ; Das ist Absatz #1" & @CRLF & _
    "" & @CRLF & _
    " Name_Absatz1" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    "" & @CRLF & _
    "/end xyz" & @CRLF & _
    "" & @CRLF & _
    "/begin xyz" & @CRLF & _
    "" & @CRLF & _
    " Name_Absatz2" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    "" & @CRLF & _
    "/end xyz" & @CRLF & _
    "" & @CRLF & _
    "Textzeile" & @CRLF & _
    "Textzeile" & @CRLF & _
    "" & @CRLF & _
    "" & @CRLF & _
    "/begin xyz" & @CRLF & _
    "" & @CRLF & _
    " Name_Absatz3" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    " Inhalt" & @CRLF & _
    "" & @CRLF & _
    "/end xyz" & @CRLF & _
    "" & @CRLF & _
    " ..." & @CRLF & _
    "" & @CRLF & _
    "Textzeile" & @CRLF & _
    "Textzeile" & @CRLF & _
    " ..." & @CRLF & _
    "Textzeile"

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

    Local $aFile
    ;~ _FileReadToArray('FilePath', $aFile)

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

    ; == zum Test wird das Array $aFile aus $sFile erstellt in identischer Form, wie es _FileReadToArray liefert:
    $aFile = StringSplit($sFile, @CRLF, 1)

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

    ; == Namen der Absätze, die NICHT entfernt werden sollen - z.B. #1 und #3
    Local $aException[2] = ["Name_Absatz1", "Name_Absatz3"]

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

    ; == Text auf Ausnahmen überprüfen und nur diese in Ausgabevariable speichern
    Local $sOut = ""
    Local $fExcept, $fDelete = False

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

    For $i = 1 To $aFile[0]
    If $fDelete Then
    If StringLeft($aFile[$i], 4) = "/end" Then $fDelete = False
    ContinueLoop
    EndIf
    If StringLeft($aFile[$i], 6) = "/begin" Then
    For $j = 0 To UBound($aException) -1
    $fExcept = False
    If StringStripWS($aFile[$i +2], 3) = $aException[$j] Then
    $fExcept = True
    ExitLoop
    EndIf
    Next
    If Not $fExcept Then
    $fDelete = True
    ContinueLoop
    EndIf
    EndIf
    $sOut &= $aFile[$i] & @CRLF
    Next

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

    ; == bereinigten Text ausgeben
    ConsoleWrite($sOut & @CRLF)

    [/autoit]
  • ...und nochwas, für die Stellen, die man NICHT löschen möchte:

    Spoiler anzeigen
    [autoit]

    #include <string.au3>

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

    dim $del
    dim $file = "test.txt"

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

    $del = _StringBetween(FileRead($file),"†","‡")

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

    for $i = 0 to UBound($del)-1
    FileWrite("test2.txt",$del[$i])
    Next

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

    FileDelete("test.txt")
    FileCopy("test2.txt","test.txt")
    FileDelete("test2.txt")

    [/autoit]

    Txt-File vorher:

    Spoiler anzeigen


    abs1
    1 jkasdfklj sdkf
    2 asdkfasldfkasdlfk safasdf
    3 sfjakfjdsalkf
    abs1 ende

    asfdasfasdfsd
    f as
    fasd
    f as
    dfasfasf
    wef243
    ff
    4f
    34f


    abs2
    4 jkasdfklj sdkf
    5 asdkfasldfkasdlfk safasdf
    6 sfjakfjdsalkf
    abs2 ende

    asfdasfasdfsd
    f as
    fasd
    f as
    dfasfasf
    wef243
    ff
    4f
    34f


    abs3
    7 jkasdfklj sdkf
    8 asdkfasldfkasdlfk safasdf
    9 sfjakfjdsalkf
    abs3 ende

    asfdasfasdfsd
    f as
    fasd
    f as
    dfasfasf
    wef243
    ff
    4f
    34f

    Txt-File nachher:

    Spoiler anzeigen


    abs1
    1 jkasdfklj sdkf
    2 asdkfasldfkasdlfk safasdf
    3 sfjakfjdsalkf
    abs1 ende

    abs2
    4 jkasdfklj sdkf
    5 asdkfasldfkasdlfk safasdf
    6 sfjakfjdsalkf
    abs2 ende

    abs3
    7 jkasdfklj sdkf
    8 asdkfasldfkasdlfk safasdf
    9 sfjakfjdsalkf
    abs3 ende

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Soooo..... Bin heute dazugekommen und hab alles getestet ;)

    Hab mich für die Version von BugFix entschieden, da ich die am einfachsten nachvollziehen konnte (man will ja schließlich auch noch was lernen ;) )

    Hat alles super geklappt, dafür nochmal vielen vielen Dank! :)


    Aber...ein Problem habe ich noch:

    Ich will das Output-File danach noch verschieben. Entweder mit FileMove oder mit FileCopy + FileDelete...

    Allerdings funktioniert der Befehl danach nicht. Über das warum kann ich nur spekulieren.

    Mein Ansatz:
    Für FileWrite am Schluss benötigt man ja kein File-handle, dass hat zur Folge, dass ich meinen Output (bis zu Exit) nicht aus dem Buffer bekomme, da FileFlush ein handle benötigt.
    Deshalb kann ich die Datei (da nicht vorhanden) nicht moven.

    Was meint ihr?

    Viele Grüße!!


    EDIT: Hab natürlich das ConsoleWrite durch FileWrite ersetzt :D

    • Offizieller Beitrag

    Ich glaube du machst es dir unnötig schwer.
    Du möchtest zum Schluss die eingelesene Datei mit der korrigierten Datei ersetzen.
    Also:

    [autoit]

    _FileReadToArray(DATEI, $array)
    ; Verarbeiten
    Filewrite(TEMPDATEI, $sOut) ; Ergebnis der Bearbeitung in temporäre Datei schreiben
    Filemove(TEMPDATEI, DATEI, Überschreibflag) ; die Tmp-Datei verschieben zur Ausgangsdatei unter Setzen des Überschreibflags - s. Hilfe

    [/autoit]
  • Nein, ich wollte nur die neue Datei in ein anderes Verzeichnis schieben.
    Aber hat sich geklärt, ich hatte nen Fehler im Code ;)

    Vielen Dank nochmal für die Mithilfe :)