Textdatei vergleichen und Doppel entfernen

  • Moin.

    Ich versuche hier zwei Textdateien zu vergleichen. In der ersten stehen alle Rechnernamen, die ich erreichen will:

    Rechner1
    Rechner2
    Rechner3
    Rechner4
    Rechner5
    Rechner6

    In der zweiten Datei habe ich alle Rechner, die ich bereits erreicht habe:
    Rechner1
    Rechner3
    Rechner5
    Rechner6

    Jetzt würde ich gerne beide Datein in ein Array einlesen, die Inhalte zeilenweise vergleichen (Zeile 1 von alle Rechner mit allen Zeilen von erreichten Rechnern, dann Zeile 2 alle Rechner usw...) und dann nur die Zeilen in eine neue Textdatei schreiben, die nicht doppelt vorkommen, sprich die nur in der Datei aller Rechner vorhanden sind, nicht aber in der Datei mit den erreichten Rechnern.

    Ich hoffe, ich konnte das Problem verdeutlichen.

    Ich habe mal meinen Ansatz hier:

    Spoiler anzeigen


    Dim $arecord, $brecord, $x, $y
    $z = 0


    Func _FileReadToArray($sFilePath, ByRef $aArray)
    ;==============================================
    ; Local Constant/Variable Declaration Section
    ;==============================================
    Local $hFile

    $hFile = FileOpen($sFilePath, 0)

    If $hFile = -1 Then
    SetError(1)
    Return 0
    EndIf

    $aArray = StringSplit( StringStripCR( FileRead($hFile, FileGetSize($sFilePath))), @LF)

    FileClose($hFile)
    Return 1
    EndFunc


    $f1 = FileOpenDialog ("File 1 auswählen", "t:\temp\test", "Text(*.txt)")
    $f2 = FileOpenDialog ("File 2 auswählen", "t:\temp\test", "Text(*.txt)")

    If Not _FileReadToArray ($f1, $arecord) Then
    MsgBox (64, "Fehler", "Konnte die Datei nicht ins Array einlesen Fehler:" & @error)
    EndIf

    If Not _FileReadToArray ($f2, $brecord) Then
    MsgBox (64, "Fehler", "Konnte die Datei nicht ins Array einlesen Fehler:" & @error)
    Exit
    EndIf

    For $x = 1 to $arecord[0] ;Step 1
    For $y = 1 to $brecord[0] ;Step 1
    If StringInStr($arecord[$x], $brecord[$y]) Then
    MsgBox (0, "Tipp:", "Doppel: " & $arecord[$x])
    $z = $z + 1

    Else
    $z = 0
    MsgBox (0, "Tipp:", "Einmalig: " & $arecord[$x])
    $f3 = FileOpen ("t:\temp\test\test3.txt", 1)
    FileWriteLine ($f3, $arecord[$x] & @CRLF)
    FileClose ($f3)

    EndIf
    Next
    Next

    Dabei kommt aber eine Datei heraus, die die Zeile Rechner1-6 je 4-mal enthält und außerdem noch 4 Leerzeilen?!?

    *ratlosist*

    Danke schonmal.

    Praep

    Einmal editiert, zuletzt von praep (28. November 2006 um 09:52)

    • Offizieller Beitrag

    HI,

    hier mal quick & dirty ohne Error handling!

    [autoit]

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

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

    $a = _CompareFiles(@ScriptDir & "\1.txt", @ScriptDir & "\2.txt")
    _ArrayDisplay($a, "")

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

    Func _CompareFiles($filename_1, $filename_2)
    Local $newFile[1], $file1_A, $file2_A
    _FileReadToArray($filename_1, $file1_A)
    _FileReadToArray($filename_2, $file2_A)
    For $i = 1 To UBound($file2_A) - 1
    If _ArraySearch($file2_A, $file1_A[$i]) = -1 Then
    _ArrayAdd($newFile, $file1_A[$i])
    EndIf
    Next
    Return $newFile
    EndFunc ;==>_CompareFiles

    [/autoit]

    So long,

    Mega

  • Moin Mega.

    Danke für dein Script, klappt prima.

    :party4: :party3:

    Nur dass bei mir immer Fehlermeldungen beim Starten kommen, wenn ich file.au3 und array.au3 include - ich muss die benötigten Funktionen per Hand rauskopieren und im Script einfügen - dann gehts ohne Fehler durch. Den Eintrag _arrayDisplay habe ich gegen:

    [autoit]


    _FileWriteFromArray ("t:\temp\test\test3.txt", $a)

    [/autoit]


    ersetzt - dann schreibts mir die Ergebnisse auch ins File.


    So long derweil - ich lass das script jetzt mal auf meine großen Dateien los ... das kann dauern.

    So long an thanks for all the fish derweil.

    Einmal editiert, zuletzt von praep (28. November 2006 um 11:55)

  • Gerade hat sich noch ein Problem ergeben - beim Vergleich der langen Dateien hat sich eine Differenz zwischen den wirklichen Datensätzen und dem Ergebnis des Scripts herausgestellt - es scheint zu früh mit dem Vergleichen aufzuhören - wahrscheinlich hat er als Durchlaufzähler die 2. Datei, die ja kürzer ist - der Suchlauf müsste also öfter vonstatten gehen.

    Wenn ich weniger Datensätze nehme - 20 oder 30 - dann klappt es richtig.

    *etwas ratlos* - werde aber noch zu debuggen versuchen.

    ---------------------------------------------------------------------------

    Habe den Fehler gefunden:

    [autoit]

    For $i = 1 To UBound($file1_A) - 1 ; hier Stand UBound($file2_A)

    [/autoit]

    Jetzt funzt es ...

    :kette:

    Hooray for Mega :tassen:

    Bis denne

    Praep

    Einmal editiert, zuletzt von praep (28. November 2006 um 13:20)

  • Ups - da war einer schneller.

    *lol*

    Es geht halt nichts über eine funktionierende F5-Taste

    :hm:

    Dir noch einen schönen Tag und tausend Dank.

    Praep

    Einmal editiert, zuletzt von praep (28. November 2006 um 13:22)