TXT-Datei nach Vergleich um nicht-vorhandene Zeilen ergänzen

  • Edit: Ich glaube ich habe im Posting "2 TXT dateien vergleichen" meine ANtwort gefunden, trotzdem Danke !!!

    Hallo an Alle die mir helfen wollen (und alle anderne)!!!

    Ich bin noch ein ziemlicher Neuling auf dem Gebiet des Scriptens und daher bitte ich schon mal im Voraus
    um Verzeihung für etwaige dumme Fragen.
    Nun zu meinem Problem an dem ich mir gerade die Zähne ausbeiße:

    Ich muß eine TXT-Datei nach Einträgen durchsuchen die dort noch nicht vorhanden sind.
    Wenn ich also einen fehlenden Eintrag habe muß dieser in die Datei geschrieben werden.
    Dazu arbeite ich mit einem Array, dass ich zur Zeit noch händisch ins Script schreibe ($aCert). Später
    kann man es bestimmt auch aus einer Datei auslesen.
    Jedenfalls lese ich die zu durchsuchende Datei mit _FileReadToArray aus nach $aRecord und möchte es dann
    mit dem $aCert Array vergleichen. Alle neuen Einträge aus dem $aCert sollen als neue Zeile in die Datei geschrieben werden.
    Hoffe ich hab mich verständlich ausgedrückt.

    [autoit]


    Global $aCert[9]
    $aCert[0] = "texttexttexttexttext 1"
    $aCert[1] = "texttexttexttexttext 2"
    $aCert[2] = "texttexttexttexttext 3"
    $aCert[3] = "texttexttexttexttext 4"
    $aCert[4] = "texttexttexttexttext 5"
    $aCert[5] = "texttexttexttexttext 6"
    $aCert[6] = "texttexttexttexttext 7"
    $aCert[7] = "texttexttexttexttext 8"
    $aCert[8] = "texttexttexttexttext 9"

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

    Dim $aRecords
    If Not _FileReadToArray("Datei.txt",$aRecords) Then
    MsgBox(4096,"Error", " Fehler beim Einlesen der Datei Fehler:" & @error)
    Exit
    EndIf

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

    ;jetzt müsste glaube ich eine For...Next Schleife kommen, die den Vergleich tätigt
    ;aber wie muss die aussehen?

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

    Die Datei.txt beinhaltet nur die Einträge "texttexttexttexttext 3, 6 und 7" und sollen durch "texttexttexttexttext 1, 2, 4, 5, 8 und 9" ergänzt werden.

    Danke schon für´s durchlesen und vorab für´s helfen.

    Gruß Forscher

    3 Mal editiert, zuletzt von Forscher (1. Juni 2011 um 15:52)

  • Ich hatte gehofft in dem anderen Posting etwas zu finden das mir hilft, aber scheinbar stell ich mich
    auch da zu blöd an.
    ich brauche also weiterhin eure hilfe.

    danke
    Forscher

  • Ist es wichtig, in welcher Reihenfolge die Zeilen in der Datei stehen? Wenn nicht, dann kannst du folgendes machen:
    - $aRecords sortieren, Dann für jede Zeile in $aCert _ArrayBinarySearch aufrufen, falls sie nicht gefunden wird, an die Datei anhängen
    - oder nicht sortieren und für jede Zeile in $aCert _ArraySearch aufrufen, falls sie nicht gefunden wird, an die Datei anhängen

    Wenn du viele neue Zeilen hast, kann sich durch die kürzere Suchzeit das sortieren lohnen. wenn du jedoch nur wenige Zeilen einfügen musst, dann ist das Suchen auf den originalen Daten insgesamt schneller.

  • @progandy:
    Danke für deine Hilfe aber irgendwie habe ich ne geistige Blockade.
    Habe heute den ganzen Tag versucht deine Tips umzusetzen, aber leider ohne Erfolg.
    Leider ist die Reihenfolge wichtig. Die ersten drei Zeilen in jeder Datei dürfen nicht verändert werden (sind aber identisch).
    Danach wird Zeilenweise alles untereinander schrieben. Genau diese Zeilen gilt es zu vergleichen. Beide Dateien sind
    identisch aufgebaut nur eben leider ab der vierten Zeile völlig durcheinander.
    Habe ein Posting gefunden in dem es darum geht zwei Dateien auszulesen und dann beide in eine Datei zu schreiben
    ohne die Doppelten einträge. Aber auch damit bin ich nicht weiter gekommen.
    Gibt es nicht eine Möglichkeit die erste Zeile aus Datei 1 zu nehmen und sie dann sequenziell mit den Zeilen in Datei 2 zu vergleichen.
    Wenn sie vorhanden ist dann nehme Zeile 2 aus Datei 1 und vergleiche sie wieder mit allen andern Zeilen aus Datei 2.
    Wenn sie NICHT vorhanden ist, dann füge diese Zeile aus Datei 1 an das Ende von Datei 2 an.

    Das ist es was ich bräuchte und einfach nicht hinbekomme.

  • Vielleicht hilft Dir das weiter:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Opt('MustDeclareVars', 1)

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

    Global $aCert[9]
    $aCert[0] = "texttexttexttexttext 1"
    $aCert[1] = "texttexttexttexttext 2"
    $aCert[2] = "texttexttexttexttext 3"
    $aCert[3] = "texttexttexttexttext 4"
    $aCert[4] = "texttexttexttexttext 5"
    $aCert[5] = "texttexttexttexttext 6"
    $aCert[6] = "texttexttexttexttext 7"
    $aCert[7] = "texttexttexttexttext 8"
    $aCert[8] = "texttexttexttexttext 9"

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

    ; Annahme, dass Array von "Datei.txt" etwa so aussehen könnte:
    Global $aRecords[3]
    $aRecords[0] = "texttexttexttexttext 3"
    $aRecords[1] = "texttexttexttexttext 6"
    $aRecords[2] = "texttexttexttexttext 7"

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

    _Main()

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

    Func _Main()

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

    Local $i = 0, $k = 0, $vorhanden = False

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

    For $i = 0 To 8 ; die abzuprüfenden Inhalte von $aCert
    For $k = 0 To 2 ; die Array-Inhalte aus Datei.txt
    If $aRecords[$k] = $aCert[$i] Then $vorhanden = True
    Next
    If $vorhanden = False then
    _ArrayAdd($aRecords, $aCert[$i])
    Else
    $vorhanden = False
    EndIf
    Next
    _ArrayDisplay($aRecords)

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

    EndFunc ;==>_Main

    [/autoit]

    MfG ThPfund

    "Es könnte alles so einfach sein..."

  • Vielen, vielen Dank. Ganau das war es.
    Habe es jetzt mal auf zwei Dateien angepasst.
    Sieht so schon ganz gut aus, allerdings bekomme ich beim Zusammenfügen der beiden
    Dateien immer die Anzahl der Einträge der Array´s eingefügt.
    Hast du dazu noch eine Idee? Ansonsten helfe ich mir gerade damit das ich die Einträge "0"
    jeweils lösche. Ist nicht so ganz die feine Art aber es hilft zumindest erstmal.
    Habe noch mal das Skript und die beiden txt-Datein angehängt zum besseren Testen.

    Und nochmal ganz großen Dank für die schnelle und gute Hilfe

    Gruß
    Forscher

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

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

    Opt('MustDeclareVars', 1)

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

    Local $aCert_alt, $aCert_neu

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

    _FileReadToArray("C:\Datei_neu.txt", $aCert_neu)
    _ArrayDisplay($aCert_neu, "Inhalt Datei_neu")
    _FileReadToArray("C:\Datei_alt.txt", $aCert_alt)
    _ArrayDisplay($aCert_alt, "Inhalt Datei_alt")

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

    _Main()

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

    Func _Main()

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

    Local $i = 0, $k = 0, $vorhanden = False

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

    For $i = 0 To UBound($aCert_neu) -1
    For $k = 0 To UBound($aCert_alt) -1
    If $aCert_alt[$k] = $aCert_neu[$i] Then $vorhanden = True
    Next
    If $vorhanden = False then
    _ArrayInsert($aCert_alt, $i +1, $aCert_neu[$i]) ;fügt die Zeile dort ein wo sie in der anderen Datei steht
    ;_ArrayAdd($aCert_alt, $aCert_neu[$i])
    Else
    $vorhanden = False
    EndIf
    Next
    _ArrayDelete($aCert_alt, 0) ;ohne diese beiden Zeilen würden in die ersten beiden Zeilen jeweils die
    _ArrayDelete($aCert_alt, 0) ;die Anzahl der Einträge des Array´s eingefügt
    _ArrayDisplay($aCert_alt)
    _FileWriteFromArray("C:\Datei_alt.txt", $aCert_alt) ;schreibt das neu erstellete Array in die entgültige Datei

    ShellExecute("C:\Datei_alt.txt") ;zur überprüfung öffne ich die Datei

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

    EndFunc

    [/autoit]
  • Freut mich, wenn ich Dir helfen konnte. :)
    Dass die Funktion _FileReadToArray() die Anzahl der Einträge der Array´s einfügt ist dort so vorgesehen (s. Hilfe: "$aArray[0] enthält die Anzahl der Zeilen, welche in das Array eingelesen wurden"). Ich kenne keine Möglichkeit, dies abzuschalten.
    Ist ja manchmal auch ganz nützlich, allerdings nicht für diese Anwendung, da sich durch die Inserts die Zeilenzahl verändert. Insofern ist es die richtige Lösung, die beiden Zeilen selbst zu löschen.

    MfG ThPfund

    "Es könnte alles so einfach sein..."

  • @ Scritch

    Ich arbeite ja schon mit dem _ArrayDelete in Zeile 31 und 32 oder meintest du noch ne andere Möglichkeit?

  • Hier noch eine Variante:

    [autoit]


    #include <Array.au3>
    #Include <File.au3>
    Global $aAlt, $aNeu
    _FileReadToArray("alt.txt", $aAlt)
    _FileReadToArray("neu.txt", $aNeu)
    _ArrayDelete($aAlt, 0)
    _ArrayDelete($aNeu, 0)
    _ArrayConcatenate($aAlt, $aNeu)
    $aAlt = _ArrayUnique($aAlt)
    _ArraySort($aAlt)
    _ArrayDelete($aAlt, 0)
    _ArrayDisplay($aAlt)

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • @ UEZ

    Schöne Variante, da ich den Befehl _ArrayConcatenate noch nicht kannte.
    Leider bringt auch das nicht so ganz den gewünschten Erfolg.
    Da die ersten drei Zeilen der beiden Dateien identisch sind und in der Reihenfolge nicht verändert werden dürfen.
    Die Funkionalität deines Scripts ist super wenn nicht das Problem der ersten drei Zeilen wäre.
    Dennoch vielen Dank (man kann dadurch nur lernen ;) )
    Forscher

  • Jaaaaaaaaa, das war es. Super.

    DANKE !!!! 8o

    DANKE an alle die geholfen haben

    Gruß Forscher