FileReadLine zu langsam

  • Hallo Zusammen,

    ich wollte gerade mal wieder etwas mit AutoIt coden. Konkret geht es darum mehrere ca. 1.1MB grosse RTF Files zu parsen und als CSV zu speichern. Das einlesen der ca. 6000 Zeilen pro File dauert mit Autoit Minuten (nach 6 Minuten hatte ich die Faxen dicke), man kann zusehen wie AutoIt die Zeilen einliest, es funktioniert aber es ist viel zu langsam.

    Zu beobachten war auch, dass FileReadLine OHNE expliziete Angabe der linenumber immer nur die erste Zeile einliest

    Woran liegt das????

    Danke für Eure hilfe. Mit freundlichen Grüßen
    Lutz

    P.S: Das olle brexx benötigt dafür nur Sekundenbruchteile

    P.P.S.: Der unvollständige Code:

    Spoiler anzeigen
    [autoit]

    ; pcdmis2csv00.au3.au3
    #include-once
    #include <\Archiv\Prg\AutoIt\Include\rexx01.au3>
    #include <\Archiv\Prg\AutoIt\Include\tools00.au3>
    #include <\Archiv\Prg\AutoIt\Include\stack00.au3>

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

    ; Grundeinstellungen
    HotKeySet("{PAUSE}", "MeinExit")

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

    ; Hilfsfunktionen
    Func MeinExit()
    Exit
    EndFunc

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

    ; init
    $n_s1 = inistack() ; init stack 1

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

    $search = FileFindFirstFile(@WorkingDir&"\*.rtf")
    If $search = -1 Then
    MsgBox(0, @ScriptName&": Fehler!", "Keine RTF Dateien in >"&@WorkingDir&"< gefunden")
    Exit
    EndIf
    While 1
    $dummy = FileFindNextFile($search)
    If @error Then ExitLoop
    push($n_s1,$dummy)
    WEnd
    FileClose($search)

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

    send("^n")

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

    while eos($n_s1)
    $datei_r = pop($n_s1)
    $datei_w = changestr('.rtf',$datei_r,'.csv')
    fileopen($datei_r,0) ; Quelle lesend geöffnet
    fileopen($datei_w,2) ; Ziel überschreibend geöffnet
    tooltip(@ScriptName&"- Datei: "&$datei_r&" wird bearbeitet", )
    $n = 0 ; Startzeile Messprogramm
    While 1
    $n = $n + 1
    $zeile = FileReadLine($datei_r,$n)
    ; tooltip($zeile)
    if $zeile = "}}" Then ExitLoop ; Ende des RTF
    ; if pos('SCN',$zeile) > 0 then
    ; $rl = length($zeile) - pos('SCN',$zeile) + 1
    ; $zeile = right($zeile,rl)
    ; ele = word(zeile,1)
    ; endif

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

    ; MsgBox(0, "Line read:", $n)
    Wend

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

    fileclose($datei_r)
    fileclose($datei_w)
    wend

    [/autoit]

    Edit BugFix: Tags gesetzt

    • Offizieller Beitrag

    Du mußt FileOpen mit Filehandle verwenden.

    $fh = FileOpen($datei, $flag)

    Und dann für alle Aktionen das Handle ansprechen:

    $zeile = FileReadline($fh, $n)

    Spoiler anzeigen
    [autoit]

    ; pcdmis2csv00.au3.au3
    #include-once
    #include <\Archiv\Prg\AutoIt\Include\rexx01.au3>
    #include <\Archiv\Prg\AutoIt\Include\tools00.au3>
    #include <\Archiv\Prg\AutoIt\Include\stack00.au3>

    ; Grundeinstellungen
    HotKeySet("{PAUSE}", "MeinExit")

    ; Hilfsfunktionen
    Func MeinExit()
    Exit
    EndFunc

    ; init
    $n_s1 = inistack() ; init stack 1


    $search = FileFindFirstFile(@WorkingDir&"\*.rtf")
    If $search = -1 Then
    MsgBox(0, @ScriptName&": Fehler!", "Keine RTF Dateien in >"&@WorkingDir&"< gefunden")
    Exit
    EndIf
    While 1
    $dummy = FileFindNextFile($search)
    If @error Then ExitLoop
    push($n_s1,$dummy)
    WEnd
    FileClose($search)

    send("^n")

    while eos($n_s1)
    $datei_r = pop($n_s1)
    $datei_w = changestr('.rtf',$datei_r,'.csv')
    $fh1 = fileopen($datei_r,0) ; Quelle lesend geöffnet #### Filehandle
    $fh2 = fileopen($datei_w,2) ; Ziel überschreibend geöffnet #### Filehandle
    tooltip(@ScriptName&"- Datei: "&$datei_r&" wird bearbeitet", )
    $n = 0 ; Startzeile Messprogramm
    While 1
    $n = $n + 1
    $zeile = FileReadLine($fh1,$n)
    ; tooltip($zeile)
    if $zeile = "}}" Then ExitLoop ; Ende des RTF
    ; if pos('SCN',$zeile) > 0 then
    ; $rl = length($zeile) - pos('SCN',$zeile) + 1
    ; $zeile = right($zeile,rl)
    ; ele = word(zeile,1)
    ; endif


    ; MsgBox(0, "Line read:", $n)
    Wend

    fileclose($fh1)
    fileclose($fh2)
    wend

    [/autoit]

    Achso, wo schreibst du eigentlich ??

  • Hallo BugFix,

    Du machst Deinem nickname alle Ehre. Meiner einer hatte doch tätsächlich den Filehandle vergessen :rolleyes:, was die Sache mit der mangelnde Geschwindigkeit erklärt. Mit dem entsprecheden handle läuft es sehr zügig.

    Danke und Gruß
    Lutz

  • ReHi,

    auch wenn es evtl. etwas am allgemeinen Interesse vorbeigeht, möchte ich die Lösung meines Problems veröffentlichen. Es geht darum Messdaten aus RTF Files die in einem Verzeichnis liegen nach CSV umzuwandel.

    Evtl. hilft es bei ähnlichen Problemen wieter.

    Mit freundlichen Grüßen
    Lutz

    P.S.: Die includes liegen hier noch im Skriptbereich