Zeilen aus Textdatei löschen

  • Hallo zusammen :)

    ich möchte gerne aus mehreren Textdateien die ersten 8 Zeilen und die letzten 15 Zeilen löschen.

    Ich finde zwar viel zum Thema Leere Zeilen löschen oder Text ersetzen, aber leider nichts zum löschen einer kompletten Zeile. Gibt es überaupt einen Befehl für dafür?

    Danke im Voraus.

    Gruß Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Du könntest die jeweilige Datei in ein Array einlesen.

    -> prüfen, ob überhaupt genügend Zeilen vorhanden sind

    -> die entsprechenden Indices aus dem Array löschen

    -> Array als Datei (zurück-)speichern (overwrite)

    EDIT : Stichworte _FileReadToArray , _ArrayDelete , _FileWriteFromArray

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (25. März 2020 um 12:44)

  • So könnte eine Variante aussehen :

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Hallo Musashi

    vielen Dank für die schnelle Hilfe. Habe soweit alles verstanden bis auf Zeile 25:

    Code
    $g_sRange = String(UBound($g_aFileArr) - 15) & "-" & String(UBound($g_aFileArr) -1)

    An welcher Stelle schreibt er denn die Anzahl der Zeilen in die Variable $g_aFileArr? Ubound kann ich noch nachvollziehen. Aber dann hört es auf.

    Auch dahinter: String(Ubound($g_aFileArr) -1). Warum hier noch mal -1?

    Gruß Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Wenn ich mich nicht irre: Garnicht.

    Das wäre dann:

    AutoIt
    $g_aFileArr[0] = UBound($g_aFileArr) - 1

    Wenn du darauf also Wert legst, müsstest du das in Zeile 28 einfügen.

  • Warum hier noch mal -1?

    Arrays in AutoIt und in den meisten Programmiersprachen sind nullbasiert.

  • Hallo zusammen,

    die Arrays verstehe ich. Meine Frage ist: Da steht ja schon -15. Warum dahinter also noch mal -1?

    Gruß Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Habe soweit alles verstanden bis auf Zeile 25 [...] die Arrays verstehe ich. Meine Frage ist: Da steht ja schon -15. Warum dahinter also noch mal -1?

    Zeile 25 = $g_sRange = String(UBound($g_aFileArr) - 15) & "-" & String(UBound($g_aFileArr) -1)

    Hier wird eine Range (also ein im Array zu entfernender Bereich) festgelegt.

    Bei den ersten 8 Zeilen ist die Range immer 0-7 (bzw. 1-8, wenn [0] die Anzahl der Elemente enthält).

    Bei den letzten 15 Zeilen wird die Range berechnet, da die Dateien ja eine unterschiedliche Anzahl an Zeilen haben können. Außerdem wurden die ersten 8 Zeilen bereits entfernt.

    Lasse Dir $g_sRange mal mit ConsoleWrite ausgeben.

    Das Beispiel ist, wie gesagt nur ein möglicher Ansatz.

    Gruß Musashi

  • Nachtrag :

    Mikki :

    Beim Ansatz von _mk_ werden die ersten 8 und die letzten 15 Zeilen des Array nicht zurückgeschrieben, anstatt sie vor einem _FileWriteFromArray aus dem Array zu entfernen. Das geht natürlich auch.

    Bei seinem aktuellen Beispiel gilt es aber zu beachten, dass ALLE Textdateien des Verzeichnisses bearbeitet werden, was Du ggf. (noch) nicht möchtest !

    _mk_ (nur so am Rande) :

    Variablendeklarationen mit Dim werden i.a. nicht (mehr) empfohlen.

    Man verwendet i.d.R. Global oder Local , je nach Scope.

    Mikki : EDIT -> viele Wege führen nach Rom (na ja, in Corona-Zeiten wohl eher nicht :()

    Man könnte sicher auch die Datei einlesen und mittels RegEx die Bereiche (anhand der Zeilenumbrüche) herausfiltern usw.. Wichtig ist aber, wie immer, dass Du den Vorgang nachvollziehen kannst !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    3 Mal editiert, zuletzt von Musashi (27. März 2020 um 06:27) aus folgendem Grund: typo

  • Hallo Musashi

    Viele Funktionen wie _ArrayToString oder _FileWriteFromArray haben das was du da mit _Arraydelete zusammenbastelst schon eingebaut. Schau dir einfach mal die weiteren Parameter an. Dann kannst dir den ganzen Mittelteil sparen ;)

    Grüße autoiter

  • Viele Funktionen wie _ArrayToString oder _FileWriteFromArray haben das was du da mit _Arraydelete zusammenbastelst schon eingebaut.

    Ich weiß ;).

    Bei _FileWriteFromArray kann man den Startindex des Arrays und den letzten Index, der in die Datei geschrieben werden soll direkt mittels optionaler Parameter festlegen.

    Das Beispiel sollte Mikki auch mehr das Prinzip nahebringen, falls er z.B. einen Bereich "aus der Mitte" entfernen möchte.

    Gruß Musashi

    P.S. : an Dich, Familie und Freunde ==> bleibt gesund :thumbup:

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Nachtrag : Mikki

    Hier eine verkürzte Variante bei Verwendung der optionalen Parameter von _FileWriteFromArray :

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Guten Abend zusammen,

    danke für die vielen Antworten :) Musste noch lange arbeiten und dementsprechend antworte ich jetzt erst.

    Ich werde mir Morgen die Funktionen anschauen und das ganze mal in Ruhe genauer betrachten. Vorerst werde ich das Thema schließen.

    Musashi : Danke noch für die Short Version ;)

    Vielen Dank an alle :)

    Bleibt Gesund :thumbup:

    Gruß Mikki

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

  • Musashi

    _mk_ (nur so am Rande) :

    Variablendeklarationen mit Dim werden i.a. nicht (mehr) empfohlen.

    Man verwendet i.d.R. Global oder Local , je nach Scope.

    Danke für den Hinweis. In komplexeren Skripte bzw. Skripte, die produktiv im Einsatz sind, verwende ich für die Variablendeklaration die Schlüsselwörter Global und Local. Künftig werde ich Dim vermeiden. 8)

  • Für Interessierte ein Beispiel, um einen Bereich von Zeilen mittels RegEx aus dem Text zu entfernen (kann man ggf. ja mal gebrauchen ;)) :

    AutoIt
    Global $g_sText, $g_sTextNew, $g_iDelStart, $g_iDelEnd
    $g_sText = "Zeile1" & @CR & "Zeile2" & @CR & "Zeile3" & @LF & "Zeile4" & @CR & "Zeile5" & @CRLF & "Zeile6" & @CR
    
    ConsoleWrite("! >>>>> VORHER <<<<< " & @CRLF & $g_sText)
    ; Zeilen 2 bis 5 löschen :
    $g_iDelStart = 2
    $g_iDelEnd   = 5
    $g_sTextNew = StringRegExpReplace($g_sText, "(?s)((\V*\v*){" & $g_iDelStart - 1 & "})(\V+\v*){" & ($g_iDelEnd - $g_iDelStart + 1) & "}(.*$)", "\1\4")
    ConsoleWrite("+ >>>>> NACHHER <<<<< " & @CRLF & $g_sTextNew)

    ( Mikki : Ich empfehle Dir aber eine der o.a. Lösungen)

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."