wie kann ich Text am Zeilenende(!) in eine Datei einfügen

  • Nabend zusammen

    ich möcht gern mit Autoit eine Datei erstellen die riesig groß wird.
    ich möchte Sie in kleine Blöcke aufsplitten und suche daher eine einfach
    und vor allem schnelle lösung für folgenden fall

    Datei vor´m Scriptdurchlauf

    Code
    0001
    0002
    0003
    0004
    0005


    Nach dem Durchlauf

    Code
    0001	0815
    0002	1234
    0003	0007
    0004	5678
    0005	2468

    Das File soll am Ende etwa 2000 Zeichen breite haben und über 30 000 Zeilen länge
    und jeder Block etwa 20 Zeichen und ebenfalls 30 000 länge.

    Zurzeit folgendermaßen umgesetzt

    [autoit]

    #include <File.au3>
    #include <array.au3>

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

    ;Variablenvergabe
    $Zeilenanzahl = 5
    global $Array[$Zeilenanzahl+1]
    $Array[1]=" 0815"
    $Array[2]=" 1234"
    $Array[3]=" 0007"
    $Array[4]=" 5678"
    $Array[5]=" 2468"
    global $file = "e:\dummy.txt"

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

    ;Datei öffnen
    FileOpen( $file, 1)
    If @error = -1 Then MsgBox(0, "Fehler", "Die Datei konnte nicht geöffnet werden.")

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

    ;file lesen und neu schreiben
    For $i =1 to $Zeilenanzahl Step 1
    $line = FileReadLine($file,$i)
    If @error = -1 Then MsgBox(0, "fehler beim inhalt lesen","")
    $neu = $line & $Array[$i]
    _FileWriteToLine($file, $i, $neu, 0)
    If @error = -1 Then MsgBox(0, "fehler beim Zeile schreiben","")
    Next
    FileClose($file)

    [/autoit]

    Wer den Code anschaut sieht, ich lese jetzt die aktuelle zeile aus, addiere den neuen teil dazu und schreib dann die ganze zeile neu - obwohl ich doch eigentlich nur sachen am Ende einfügen will... - hat jemand eine idee wie das effizienter geht ohne den ganzen Block oder gar die Ganze datei einzuladen

    Für Rechtschreibfehler gibt es keinen Finderlohn!!

    Einmal editiert, zuletzt von WiDDoW (31. März 2012 um 14:55)

  • Für diesen Zweck solltest du die Datein zuerst in eine neue Datei schreiben:
    - Lies ein paar Zeilen aus der alten Datei
    - Konvertiere sie in das neue Format
    - Schreibe die Zeilen in die neue Datei
    - Wiederholen, bis alle Zeilen bearbeitet
    - Alte Datei mit neuer Datei überschreiben.

    Alle Aktionen auf der selben Datei durchzuführen ist viel zu langsam, denn _FileWriteToLine macht folgendes: ganze Datei lesen, Alles vor der gewünschten Zeile schreiben, neue Zeile schreiben, alles nach der Zeile schreiben. Wenn du alle Zeilen bearbeiten willst, ist das unnötiger Aufwand.

  • klingt vielversprechend, ich werd auch in dieser Richtung mal noch ein wenig experimentieren.
    aber ich glaub dennoch dieses Projekt als unlösbar aufzugeben.

    ich hab mal folgenden minitest gemacht. - eine zufällige Zahl in ein File schreiben und mehr nicht.
    und das ganze dann 10 000 mal wiederholen dauert schon weit über 6 minuten. das ist viel zu viel

    [autoit]


    #include <File.au3>

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

    global $Datensatzanzahl = 10000
    global $Filename = "e:\dummy.txt"

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

    FileOpen( $Filename, 1)

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

    For $i =1 to $Datensatzanzahl Step 1
    _FileWriteToLine($Filename, $i, random(0001,9999,1), 0)
    Next
    FileClose($Filename)

    [/autoit]

    ich werd jetzt mal schauen, wie es sich verhält wenn ich 1000 Zahlen generiere und die dann auf einmal in die Datei schreibe - vielleicht geht das schneller. aber danke erst mal bis hier her - wenn noch jemand optimierungsmaßnahmen hat - ich freue mir :)


    EDIT:
    Gerade hab ich ein großes array erstellt und es dann auf einmal in die Datei geschrieben - ging viel schneller und eigentlich
    will ich ja meine Datei in einem "aufwasch" erstellen. der Benutzer soll über GUI seine Blöcke zusammen stellen können
    (also zB:Block1 = Fortlaufende Nr. von 1 bis 30 000 Block2 = zufällige 5 stellige Nr. usw)
    (Am anfang beim ersten Post dachte ich das wär zu groß)
    Wenn ich jetzt für jeden Block ein Array vergebe und dann alles auf einmal schreibe also vielleicht:

    30 Blöcke mit je etwa 10zeichen und bis zu 30 000 Zeilen - sprenge ich damit die Grenzen von autoIt???
    ein Array mit 10 x 50000 einträgen geht aber 30 Arrays in der größe...?
    Dann muss ich nur noch beim Datei erstellen irgendwie die Array mischen - also:
    Zeile 1 Block 1 Block 2 usw
    Zeile 2 Block 1 Block 2 usw

    Für Rechtschreibfehler gibt es keinen Finderlohn!!

    2 Mal editiert, zuletzt von WiDDoW (31. März 2012 um 14:00)

  • ich glaub ich hab jetzt des rätsels lösung:

    ich werde die ganzen blöcke in jeweils einem array erstellen. so kann über die GUI das komplette File aufgebaut werden.
    danach mach ich ein neue mehrdimensionales Array und packe da alle Blöcke, aber nur jeweils 1000 Zeilen rein und
    aus diesen neuen Arrays erstelle ich dann meine Datei, weil ja jetzt die Blöcke richtig "gemischt" sind.

    danke bis hier her
    /can be closed
    ggf. meld ich mich nochmal

    Für Rechtschreibfehler gibt es keinen Finderlohn!!

    • Offizieller Beitrag

    Ja, melde dich bitte noch mal, wenn du fertig bist. Ich werde das Gefühl nicht los, dass es effizienter gehen wird :). Wichtig ist, die Datei so selten wie möglich zu öffnen und zu schließen und dazwischen IMMER mit dem Handle zu arbeiten. Viele Funktionen nehmen (leider…) auch den Datennamen als Parameter an, öffnen und schließen dann aber selbst noch mal.

    Johannes

  • Danke für den Hinweis

    Gerade habe ich ein Testfile erstellt mit 15 Blöcken und etwa 200 Zeichen Gesamtbreite. Die Testdatei war 50 000 Zeilen lang und das erstellen hat keine 5 Sekunden gedauert.
    (Die Datei war am ende 12mb groß)

    Selbst wenn der User die Datei doppelt so groß macht, kann ich mit dem Zeitrahmen locker leben.


    Allerdings hab ich noch ein Problem: ich Schreibe die Datei mit _FileWriteFromArray und der macht mir nach jedem Block ein " | " als Trennzeichen rein.
    Jemand eine Idee wie ich das wegbekomme?

    hier ein Bsp das man sich dann auf dem Desktop anschauen kann

    [autoit]

    #include <File.au3>
    #include <Array.au3>
    global $array[3][3]
    $array[0][0] = "Hannes"
    $array[0][1] = "Holger"
    $array[0][2] = "Jon"
    $array[1][0] = "spielt"
    $array[1][1] = "kann"
    $array[1][2] = "jobt"
    $array[2][0] = "golf"
    $array[2][1] = "nichts"
    $array[2][2] = "als Bierholer"

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

    _FileWriteFromArray(@DesktopDir&"\" &"dummy.txt" , $array,0)

    [/autoit]


    ergebnis:

    Zitat

    Hannes|Holger|Jon
    spielt|kann|jobt
    golf|nichts|als Bierholer

    EDIT:
    Habs gefunden. In der Include Datei "file.au3 habe ich das Trennzeichen bei Zeile 237 entfernt und jetzt gehts

    Der Rest meines Projektes sollte sich mit Fleißarbeit erledigen lassen
    /can be closed

    Für Rechtschreibfehler gibt es keinen Finderlohn!!

    2 Mal editiert, zuletzt von WiDDoW (1. April 2012 um 16:10)