Zeile für Zeile (geht das irgendwie schneller?)

  • Hallo,

    mein Programm soll Zeile für Zeile eine Datei durchlaufen, und in einem anderen Format in einer anderen Datei speichern.

    Aber es dauert eeeewig. Und als ich vorhin ausversehen die ganze Zeit die gleiche Zeile in die Zieldatei geschrieben habe, ging das wesentlich schneller.

    Geht das irgendwie schneller?
    Hier der Code:

    Einmal editiert, zuletzt von P1xelfehler (28. November 2016 um 10:30)

  • Hi,

    Du darfst nicht für jede Zeile immer neu auf die Datei zugreifen.
    Lese sie in einem schwung mit Fileread aus, um die Datei einfacher zu bearbeiten kannst du dann Stringsplit benützen.
    Vor dem Schreiben der Zieldatei dann alles in ein String packen und mit einem Filewrite in die Datei schreiben.

    Ist das der aufbau der Datei?
    xxxxxxx.....yyyyyy.......z
    xxxxxxx.....yyyyyy.......z

    Wenn ja sollte auch folgendes funktionieren:

    AutoIt
    $sInput = FileRead("...")
       $sOutput = StringRegExpReplace($sInput, "(?m)^(.{7}).{5}(.{6}).{7}(.)$", "$1;$2;$3")
       FileWrite("...", $sOutput)

    mfg
    Zeitriss

  • Hi,

    Siehe dir hierzu die Hilfe von StringRegExp und StringRegExpReplace an.
    Es gibt hierzu auch min. ein Tutorial hier im Forum.
    Hier nur eine kurze Beschreibung wie ich es hier versucht habe.

    "(?m)^(.{7}).{5}(.{6}).{7}(.)$"

    (?m) - Gibt an das der Multiline-Modus benützt wird (s. Hilfe StringRegExp)
    .{7} - 7 Beliebige Zeichen die den X-Wert ergeben
    .{5} - 5 Beliebige Zeichen die wir nicht brauchen
    .{6} - 6 Beliebige Zeichen die den Y-Wert ergeben
    .{7} - 7 Beliebige Zeichen die wir nicht brauchen
    . - 1 Beliebiges Zeichen welches den Z-Wert ergibt
    ^ - Start einer Zeile
    $ - Ende einer Zeile
    () - Schließen die Werte ein die wir später noch brauchen, also X,Y und Z (back-reference)

    "$1;$2;$3"

    Hier nützen wird die "back-reference" (s. Hilfe StringRegExpReplace)
    $1 - referenziert auf die erste Klammer (also den X-Wert)
    $2 - referenziert auf die zweite Klammer (also den Y-Wert)
    $3 - referenziert auf die dritte Klammer (also den Z-Wert)


    Wir ersetzen also die Zeile durch die Platzhalter mit den Werten, welche wir oben eingeklammert haben.
    Das Semikolon ist nur das Trennzeichen im Endergebniss.

  • Du musst auch nicht die ganze Datei in den Speicher hauen und dann dort zerlegen.
    Du kannst auch problemlos weiter die Datei Zeile für Zeile (speichersparend) abarbeiten.
    Nur halt nicht ganz so wie du es gemacht hast, denn dann wird es wirklich langsam.
    Wo lag der Fehler?
    Beim Benutzen des Zeilennummerparameter von FileReadLine.

    Was passiert wenn man eine Zeilennummer dort angibt?:

    • Die Datei wird geöffnet.
    • Es wird an den Anfang der Datei gesprungen.
    • Es wird die Datei von Anfang an durchgearbeitet bis die Anzahl an Zeilenumbrüchen erreicht wurde.
    • Diese Zeile wird dann zurückgegeben.
    • Die Datei wird geschlossen.

    Und warum ist das langsam? - Nun das wird bei jedem einzelnen Aufruf erneut gemacht.
    Aber wenn wir die erste Zeile schon haben wollen wir für die Zweite Zeile nur die nächste haben. Er soll nicht wieder an den Anfang springen.
    Und das erreicht man wenn man die Datei öffnet und die Datei mit FileReadLine durchgeht ohne den Zeilenparameter zu verwenden.

    Kurz - so sollte es bedeutend schneller vonstatten gehen: