Zwei TXT vergleichen

  • Hallo Forum,

    ich habe mich durch die Hilfe gequält. Bin auch schon etwas vorwärts gekommen. Doch nun stockt es.
    Mein Problem in der test.txt steht z.B. untereinander
    1
    2
    3
    4

    in der test1.txt steht
    1
    2
    3
    4
    5
    6
    7
    und soll Zeile für Zeile die in test.txt fehlenden Zeilen eingefügt werden.
    Das Script das ich über die Hilfe gefunden habe ist

    Spoiler anzeigen
    [autoit]

    #include<file.au3>
    $file = FileOpen("test.txt", 0)
    $file1= FileOpen("test1.txt",0)
    ; Check if file opened for reading OK
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    ;$chars = FileRead($file, 1)
    ;$chars1 = FileRead($file1,1)
    If $file <> $file1 Then
    While 1
    $file = FileReadLine($file)
    If @error = -1 Then ExitLoop
    FileWriteLine($file1,"" & $file)
    WEnd
    EndIf
    FileClose($file)
    FileClose($file1)

    [/autoit]

    Leider geht es nicht so wie ich es mir vorstelle. Gibt es ein Lösungsweg?

    MFG
    Taucher_2006 :tier:

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • Guck dir mal _FileReadToArray() an und dann kannste das mit ner For schleife vergleichen und im falle mit if-abfrage ins erste file reinschreiben.

  • was willst due denn genau machen?? also was passiert wenn in txt1
    hallo welt
    und in txt2
    hallo erde steht???
    schau dir am besten das mal anKlick
    da wurde sowas ähnliches diskutiert

  • hi,
    @Daniel W. 
    das habe ich mir angeschaut komme aber mit der Hilfe dort nicht weiter. Kannst du das anschaulich da stellen?

    snoozer,
    das habe ich mir schon angeschaut aber nicht recht was gefunden. Was soll passieren test.txt hat 10 Einträge test1.txt hat 12 einträge die nicht identisch sind. Deshalb wollte ich beide vergleichen über den Operator <> und das was in der test.txt nicht drinen ist soll am Ende angehängt werden.

    Taucher_2006

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    • Offizieller Beitrag

    Hi,

    hier ganz quick&dirty :

    [autoit]

    ; Dateivergleich anhängen der Unterschiede
    #include <file.au3>
    #include <Array.au3>

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

    Global $pathMain = @ScriptDir & "\1.txt"
    Global $pathCompare = @ScriptDir & "\2.txt"

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

    Global $mainFile_A
    If Not _FileReadToArray($pathMain, $mainFile_A) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    Global $oldFile_A = $mainFile_A
    Global $compare_A
    If Not _FileReadToArray($pathCompare, $compare_A) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    For $i = 1 To UBound($compare_A) - 1
    _ArraySearch($mainFile_A, $compare_A[$i], 1)
    If @error = 6 Then _ArrayAdd($mainFile_A, $compare_A[$i])
    Next

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

    _ArrayDisplay($oldFile_A, "Alter Inhalt")
    _ArrayDisplay($mainFile_A, "Neuer Inhalt")

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

    If _FileWriteFromArray($pathMain, $mainFile_A, 1,0) Then MsgBox(0, "", "Done!")

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

    RunWait(@ComSpec & ' /c start ' & $pathMain , '', @SW_HIDE)

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

    So long,

    Mega

  • [autoit]

    #include "File.au3"
    #include "Array.au3"

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

    Global $arFile[3] = [ 2, "Test.txt", "Test1.txt" ]
    Global $sPart = @ScriptDir & "\" & $arFile[1]
    Dim $arFile1, $arFile2, $lNum

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

    _FileReadToArray( $arFile[1], $arFile1 )
    _FileReadToArray( $arFile[2], $arFile2 )

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

    If Not ( $arFile1[0] = $arFile2[0] ) and $arFile1[0] < $arFile2[0] Then
    For $lNum = $arFile1[0] + 1 to $arFile2[0]
    _ArrayAdd( $arFile1, $arFile2[$lNum] )
    Next
    _ArrayDelete( $arFile1, 0 )
    FileDelete( $sPart )
    _FileWriteFromArray( $sPart, $arFile1 )
    EndIf

    [/autoit]

    So würde das bei deinem Beispiel gehen.

    €: X( Da war er schneller -.-

    Einmal editiert, zuletzt von Daniel W. (15. November 2006 um 17:30)

  • Wunderwar!

    beide Support antoworte warum um:

    Neuer Beitrag Heute, 16:29

    das Support hier kommt nach Sekunden ;) :lol: :schild4:

  • hi,

    danke euch beiden. Ein Script funktioniert(von daniel w.) bei th. meger bekomme ich die Meldung das Error reading log to Array error:. Ich weis nicht wie ich es händeln soll. Als zwischen Frage kann man nach jeder gefundenen Zeile eine MSGBox ausgeben?
    Ansonsten läuft es schon super so wie ich es mir vorgestellt habe.

    MFG
    Taucher_2006

    ps sorry hatte die falsche Dtei beschrieben und MSGBOx kommt. Aber eine andere Sache kann man eventuel nur Zeile mit bestimmten endungen(bla.txt usw) übernehmen?

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    Einmal editiert, zuletzt von taucher_2006 (15. November 2006 um 19:48)

    • Offizieller Beitrag

    HI,

    zeig mal wie du diese beiden Zeilen angepaßt hast?

    Global $pathMain = @ScriptDir & "\1.txt"
    Global $pathCompare = @ScriptDir & "\2.txt"

    Klar geht das, entweder du machst eine z.B. For Next Schleife siehe Bsp von _FileReadToArray() oder du kannst auch alle Zeilen ausgeben lassen mit _ArrayDisplay()

    So long,

    Mega

    • Offizieller Beitrag
    Zitat

    Original von taucher_2006
    ps sorry hatte die falsche Dtei beschrieben und MSGBOx kommt. Aber eine andere Sache kann man eventuel nur Zeile mit bestimmten endungen(bla.txt usw) übernehmen?

    Hi,

    kein Problem. Klar kann man das. Du mußt bitte nur möglichst präzise beschreiben, was du willst.

    So long,

    Mega

  • hallo,

    ich habe es so gemacht
    Global $pathMain = @ScriptDir & "\test.txt"
    Global $pathCompare = @ScriptDir & "\test1.txt"

    in der einen txt steht
    1.cdr
    1.zip
    1.erx
    2.cdr
    2.erx
    2.zip
    3.cdr
    3.zip
    3.erx
    4.cdr
    4.erx
    4.zip
    5.cdr
    5.zip
    5.erx
    6.cdr
    6.erx
    6.zip
    7.cdr
    7.zip
    7.erx
    8.cdr
    8.erx
    8.zip
    hiervon sollen nur die genommen werden die auf .cdr enden.
    Habe versucht das irgendwie unterzbringen (Global $arFile[3] = [ 2, "Test.txt", "Test1.txt", "*.cdr"]) aber kam Fehler Array variable has incorrect number of subscripts or subscript dimension range exceeded.

    mfg Taucher_2006

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • [autoit]

    Global $arFile[4] = [ 3, "Test.txt", "Test1.txt", "*.cdr"]

    [/autoit]

    Du musst die Anzahl der Elemente in der Array auch erhöhen.

  • hi,

    wo soll ich noch was ändern. damit ich die Fehlermeldung los werde?
    (
    If Not ( $arFile1[1] = $arFile2[1] ) and $arFile1[1] < $arFile2[1] Then
    If Not ( $arFile1[1] = $arFile2^ ERROR)

    mfg Taucher_2006

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    • Offizieller Beitrag

    Hi,

    nimm das:

    Spoiler anzeigen
    [autoit]

    ; Dateivergleich anhängen der Unterschiede
    #include <file.au3>
    #include <Array.au3>

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

    Global $pathMain = @ScriptDir & "\1.txt"
    Global $pathCompare = @ScriptDir & "\2.txt"

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

    Global $mainFile_A
    If Not _FileReadToArray($pathMain, $mainFile_A) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    Global $oldFile_A = $mainFile_A
    Global $compare_A
    If Not _FileReadToArray($pathCompare, $compare_A) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    For $i = 1 To UBound($compare_A) - 1
    If StringRight($compare_A[$i], 4) = ".cdr" Then
    _ArraySearch($mainFile_A, $compare_A[$i], 1)
    If @error = 6 Then _ArrayAdd($mainFile_A, $compare_A[$i])
    EndIf
    Next

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

    _ArrayDisplay($oldFile_A, "Alter Inhalt")
    _ArrayDisplay($mainFile_A, "Neuer Inhalt")

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

    If _FileWriteFromArray($pathMain, $mainFile_A, 1, 0) Then MsgBox(0, "", "Done!")

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

    RunWait(@ComSpec & ' /c start ' & $pathMain, '', @SW_HIDE)

    [/autoit]

    So long,

    Mega

  • hi,
    habe den Pfad angepasst und dein Script geht auch. Kann man auch die Zeile mit Inhalt an dem das Script steht ausgeben um eventuell noch eine Func vor dem schreiben auszulösen?

    mfg Taucher_2006

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

    • Offizieller Beitrag

    Hi,

    so?

    Spoiler anzeigen
    [autoit]

    ; Dateivergleich anhängen der Unterschiede
    #include <file.au3>
    #include <Array.au3>

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

    Global $pathMain = @ScriptDir & "\1.txt"
    Global $pathCompare = @ScriptDir & "\2.txt"

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

    Global $mainFile_A
    If Not _FileReadToArray($pathMain, $mainFile_A) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    Global $oldFile_A = $mainFile_A
    Global $compare_A
    If Not _FileReadToArray($pathCompare, $compare_A) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    For $i = 1 To UBound($compare_A) - 1
    MsgBox(0,"", "Ich nehme jetzt " & $compare_A[$i] & " und werde gleich gucken ob es mit .cdr endet" )
    If StringRight($compare_A[$i], 4) = ".cdr" Then
    MsgBox(0,"", $compare_A[$i] & " endet mit cdrund deshalb gucke ich jetzt ob es schon in der Ursprungsdatei steht" )
    _ArraySearch($mainFile_A, $compare_A[$i], 1)
    If @error = 6 Then _ArrayAdd($mainFile_A, $compare_A[$i])
    EndIf
    Next

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

    _ArrayDisplay($oldFile_A, "Alter Inhalt")
    _ArrayDisplay($mainFile_A, "Neuer Inhalt")

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

    If _FileWriteFromArray($pathMain, $mainFile_A, 1, 0) Then MsgBox(0, "", "Done!")

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

    RunWait(@ComSpec & ' /c start ' & $pathMain, '', @SW_HIDE)

    [/autoit]

    So long,

    Mega

  • hi,

    danke ich glaube ich wweis wie ich weiter komme. Wenn ich nochmal Fragen habe melde ich mich. :schild4: :keks: :kiss:

    MFg

    Taucher_2006

    :P Streite nie mit einem Idioten
    Erst zieht er dich auf sein Niveau herunter und schlägt dich dort mit seiner Erfahrung :D

  • hi,

    ja da habe ich dann doch noch eine Frage. Das Script läuft von der Sache her gut, wenn ich keine Func dazwischen setze. Setze ich eine ein,dann wird die auch ausgeführt und auch geschrieben. Doch wenn ich das Script ein zweites mal aufrufe, dann beginnt es von Vorne, obwohl die Namen schon in der Referenz.prob enthalten sind. Ich wollte ja erreichen, das nur die Sachen die in der Referenz.(prob).txt nicht enthalten sind übder die Func geholt werden.
    Zum besseren Verständnis habe ich beide Dateien mit angehängt. Die Referenz.(prob).txt ist schon mit Daten befüllt, im Format wie es zu sehen ist. Die taeglich.txt wird über ein Dos Fenster befüllt. Dann soll verglichen werden und was in der Referenz.prob fehlt geholt werden. Ich hoffe es ist einleuchten was ich mache.
    Ich bin am verzweifel und komme nicht weiter. Hat wer noch einen Lösungsansatz? :weinen:

    Spoiler anzeigen
    [autoit]

    ; Dateivergleich anhängen der Unterschiede
    #include <file.au3>
    #include <Array.au3>
    Global $pathMain = "X:\CDR`S Komplett\MCI\Referenz.prob"
    Global $pathCompare = "X:\xcftp\taeglich.txt"
    Global $mainFile_A
    Opt("TrayIconDebug", 1)
    If Not FileExists ($pathCompare) Then
    _Liste()
    EndIf
    Sleep(12000)

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

    Global $oldFile_A = $mainFile_A
    Global $compare_A
    If Not _FileReadToArray($pathCompare, $compare_A) Then
    MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    For $i = 1 To UBound($compare_A) - 1
    ;MsgBox(0,"", "Ich nehme jetzt " & $compare_A[$i] & " und werde gleich gucken ob es mit .cdr endet" )
    If StringRight($compare_A[$i], 4) = ".CDR" Then
    _verizon()
    Sleep(120000)
    ;MsgBox(0,"", $compare_A[$i] & " endet mit cdr und deshalb gucke ich jetzt ob es schon in der Ursprungsdatei steht" )
    _ArraySearch($mainFile_A, $compare_A[$i], 1)
    If @error = 6 Then _ArrayAdd($mainFile_A, $compare_A[$i])
    EndIf
    Next
    _FileWriteFromArray($pathMain, $mainFile_A, 1, 0)
    ;RunWait(@ComSpec & ' /c start ' & $pathMain, '', @SW_HIDE)
    FileDelete($pathCompare)
    Func _verizon()
    run("cmd.exe")
    Sleep(500)
    send('x:{enter}')
    Sleep(500)
    Send('cd xcftp\scripts{enter}')
    Sleep(1000)
    Send('get_file CDRs ')
    Send($compare_A[$i])
    Send('{Enter}')
    Sleep(120000)
    Send('exit')
    Send('{enter}')
    EndFunc
    Func _Liste()
    Run("cmd.exe")
    Sleep(500)
    send('x:{enter}')
    Sleep(500)
    Send('cd xcftp\scripts{enter}')
    Sleep(1000)
    Send('list_directory CDRs')
    Send('{Enter}')
    Sleep(1500)
    Send('list_directory CDRs')
    Sleep(500)
    Send(' > x:\xcftp\taeglich.txt')
    Send('{Enter}')
    Sleep(3000)
    Send('exit')
    Send('{enter}')
    EndFunc

    [/autoit]