Variable Zeile für Zeile abarbeiten und verändern

  • Guten Morgen.

    Ich habe folgendes Problem. Ich möchte den Vorgang ein Textfile welches ich Zeile für Zeile abarbeite und die jeweilige Zeile verändere/manipuliere auf eine Variable ändern. Sprich ich möchte anstatt eines Files eine Variable "interaktiv" verändern, sodass kein Diskzugriff mehr nötig ist. Wie gehe ich da am besten vor? StringSplit habe ich schon probiert aber das funktioniert irgendwie nicht.

    Code
    $line = StringSplit($MeineVariable, @CRLF, 1)

    Hier der Code für die File-Variante:

    Code
    $File=FileOpen(@ScriptDir &"\.calc",2)
    While 1
        $line = FileReadLine($File)
        If @error = -1 Then ExitLoop
        $line = StringReplace($line, ".", "")
        FileWrite($File, $line & @CRLF)
    WEnd
    FileClose($File)

    4 Mal editiert, zuletzt von LosWochos (10. September 2021 um 10:02)

  • Ja man kann natürlich auch eine Variable zeilenweise durchgehen.

    Es kommen zum Fall hier für mich jedoch einige Fragen zusammen:

    • Warum soll zeilenweise gearbeitet werden und warum reicht hier nicht soetwas aus?
    AutoIt
    $sNewFile = StringReplace(FileRead("test.txt"), ".", "")
    FileDelete("test.txt")
    FileWrite("test.txt", $sNewFile)
    • Welche Verbesserung erhoffst du dir durch die Umstellung auf die Bearbeitung der Variable anstatt der Datei?
    • So wie ich deine FileVariante verstehe, dürfte diese nicht funktionieren, da 1. die Datei im Overwrite-Modus geöffnet wird und damit die Datei noch vor dem Einlesen geleert wird und 2. werden die veränderten Zeilen nur an das Ende drangehangen anstatt, dass die vorherigen überschrieben werden.

    Da mir konkrete Problemstellung und Seitenbedingungen fehlen, weiß ich nicht ob folgendes deine Frage beantwortet:

    AutoIt
    Global $sFile = ""
    For $sLine In FileReadToArray("test.txt") 
        $sFile &= StringReplace($sLine, ".", "") & @CRLF
    Next
    $sFile = StringTrimRight($sFile, 2) ; das letzte CRLF wieder entfernen
    
    ; Der bearbeitete Variableninhalt:
    ConsoleWrite($sFile)
  • 1. Schreibst du immer an das Ende deiner Datei, die letzte ausgelesene Zeile = Endlosschleife und macht aus meiner Sicht keinen Sinn. Du müsstest eine neue Datei verwenden und FilewriteLine().

    2. Anstatt Filewrite, nutze doch eine Variable in die du schreibst: $textausfile = $line & @CRLF. Falls notwendig kannst du dann Filewrite($File, $textausfile) vor dem FileClose().

    Zudem würde ich deine Schleife anders aufbauen:

    _FileCountLines nutzen anstatt While und @error

    AspirinJunkie war schneller/besser :)

  • Zudem würde ich deine Schleife anders aufbauen:

    _FileCountLines nutzen anstatt While und @error

    1. Dann geht er die Datei 2x mal durch anstatt wie jetzt nur einmal. Dazu hat er während des _FileCountLines die gesamte Datei schon im Speicher und schmeißt sie dann wieder raus um sie anschließend zeilenweise wieder durchzuarbeiten. Ressourceneffizient geht anders.
    2. Wozu muss man vor der Schleife die Anzahl der Zeilen zu wissen? Ich hoffe nicht um mit dieser den line-Parameter von FileReadLine zu befüllen - dann wird es nämlich erst richtig lahm.

    Wenn man eine Datei wirklich zeilenweise durchgehen will ohne die gesamte Datei im Speicher vorzuhalten ist der Grundaufbau von Sascha meiner Meinung nach schon die grundsätzlich vernünftigste Methode.