2 txt dateien vergleichen und 1ne machen

  • Hallo Leuts,

    habt ihr ne idee wie ich 2 Text datein vergleichen kann und daraus eine mache mit dem inhalt aus beiden ? Natürlich sollen dann nur die differenzen enthalten sein sonst wärs ja einfach ;)

    • Offizieller Beitrag

    Dazu muß man wissen, worin der Unterschied zwischen beiden Dateien bestehen wird.
    Wenn eine Datei den gleichen Inhalt wie die andere hat + zusätzlicher Daten ist es recht einfach.
    Sind mal mehr und mal weniger Daten enthalten ist das etwas schwieriger.
    Mein Vorschlag:
    - Datei 1 u. 2 zumLesen öffnen
    - Ergebnisdatei zum Schreiben öffnen
    - zeilenweise vergleichen (in Abhängigkeit von s. oben)
    - Ergebnis in Datei schreiben

  • mhhh was soll denn passieren wenn in datei 1 "hallo welt" steht und in datei 2 "hallo erde"???? => "hallo welt, hallo erde"?????? sonst wär des was bugfix vorgeschlagen hat schon ganz schick....

    • Offizieller Beitrag

    Hi,

    also da gibt es noch so viel Spielraum. Ich denke, da mußt du schon genau beschreiben was du willst.

    Könntest ja zum Beispiel einfach die zweite Datei an die erste anhängen und dann zeilenweise prüfen, ob eine Zeile doppelt ist und die dann rausschmeißen.

    ...

    So long,

    Mega

  • Also Ich habe ein programm geschrieben in dem ein notizblock enthalten ist. Dieses programm wird von ausendienstlern eigesetzt und muss daher mit dem server synchronisiert werden.

    Wenn nun ein Ausendienstler im Onsite einen Eintrag erstellt in der gleichen zeit ein Mitarbeiter im Haus so gewinnt der last write und ein eintrag is futsch.

    Das programm habe ich aber soweit animiert das es immer am ende der datei angängt also würde es reichen wenn das was die beiden unten anhängen nachher zusammen in die aktuellste datei geschrieben wird, bzw wird sie ja dann automatisch die neuste Datei.

    Hier ein Beispiel:

    Datei 1:

    Text
    Blablaneu

    Datei 2:
    Text
    Blubber neu

    Zieldatei also Datei 2 die auf dem server liegt:

    Text
    Blablaneu
    Blubberneu

    Ich weis nicht ob es was bringt aber immer eine zeile vor den Einträgen kommt ein Timestamp in form von
    Text&Now ()

    • Offizieller Beitrag

    Hi,

    ist es da nicht einfacher eine Meldung auszugeben : Die Datei wird bereits verwedet.

    Muss die Datei immer aktuell angezeigt werden? Ansonsten könnte auch jeder immer eine neue Datei schreiben und um 23 Uhr werden sie zusammengefügt.

    Oder oder oder. :teufel:

    So long,

    Mega

  • Zitat

    Original von th.meger
    ist es da nicht einfacher eine Meldung auszugeben : Die Datei wird bereits verwedet.

    Zitat

    Original von boodo
    muss daher mit dem server synchronisiert werden.


    es gibt viele möglichkeiten dass zu machen aber wenns schonmal mit dem server synchronisiert wird dann bastelt euch ne passende datenbank die verhindert dass dateien einfach überschrieben werden sowas ist nicht wirklich schwer und es gibt viele kostenlose scripte die genau sowas eigentlich machen und kostenlose anbieter wo das gehostet werden kann ebenfalls....also für mich wär da eine lösung mit autoIt die letzte variante...

  • Warum nicht einfach Windows Bordmittel nehmen? :irre:

    Kommandozeilenaufruf:

    Code
    fc Datei1.txt Datei2.txt >Unterschiede.txt


    Die Unterschiede.txt enthält dann nur noch die Unterschiede dieser beiden Dateien.
    Also als Beispiel wie man es in AutoIt verwenden würde:

    [autoit]

    Run(@ComSpec & ' /c ' & 'fc "D:\test.log" "D:\test2.log" >"D:\unterschiede.txt"')

    [/autoit]

    Hier werden die Unterschiede der Dateien aber jeweils für jede Datei einzeln angezeigt. - in deinem Beispiel mit hallo welt - hallo erde würde man das erhalten:

    ***** D:\test.log
    "hallo welt"
    ***** D:\test2.LOG
    "hallo erde"
    *****

    Einmal editiert, zuletzt von AspirinJunkie (5. November 2006 um 12:06)

  • hy,

    ich habe da so ein ähnliches Problem, an dem ich schon eine weile grübele., ob es einfach realisierbar ist.
    Problembeschreibung:
    Auf dem Server befindet sich ein Verzeichniss mit Dateinamen.Der gesamte Inhalt wird über ein DOS Komando in eine Datei kopiert. Diese Datei wird dann mit dem Datum des Tages gespeichert. Danach sollte sofern möglich die Datei mit der Datei des Vortages verglichen werden. Alles was neu in der Datei ist sollte Schritt für Schritt (jeweils eine Datei) über ein DOS Befehl vom Server gedownloadet werden. Wenn alles geladen ist soll die Datei des Vortages gelöscht werden. Am nächsten Tag läuft der gleiche Prozess ab. Ausgenommen sind WE und Feiertag.
    Nun werden sich einige Fragen warum gerade DOS und ein Server. Es ist ein sftp Server der in England steht und nur über DOS bedient werden kann. Ich bin jetzt schon soweit das die erste Datei erstellt wird. Der Rest ist mir noch nicht so recht klar.

    Vielleicht könnt Ihr mir ja helfen, damit ich weiter komme.

    MFG

    ThomasB

    MFG ThomasB

    *
    Ich lese viel und gerne (und wenn ich alle Mahnungen durch habe, schmeiße ich sie weg)
    *

    • Offizieller Beitrag

    Hi,

    okay, dann fangen wir mal wieder an, das Problem zu zerlegen.

    Server:

    1 Verzeichnis mit vielen Txt-Files.

    Diese Text-Dateien werden mit ??? Dos-Befehl zu einer großen Txt-Datei gemacht. Diese Datei wird dann mit dem Datum gespeichert Z.B. 20061105.txt

    Alles was ist, verstehe ich jetzt so: Es soll nur das übernommen, werden was in File 2 steht, wenn es nicht in File 1 steht.

    Sprich Dinge die gestern schon drin standen und heute nicht sind nicht relevant.

    Das ganze dann in einer Datei speichern und zum Download anbieten.

    Anschließend Vortag löschen und die Feiertags u. Wochenendgeschichte einbauen.

    Paßt das so?

    Was hast du an Code denn schon versucht?

    So long,

    Mega

  • hi,

    1. Auf dem Server liegen eigentlich Dateien. Über markieren ziehe ich mir die vorhandenen Dateinamen in eine txt, speichere Sie mit dem Datum von z.B. heute (20061105).
    2. Dann sollen die heute.txt mit der gestern.txt verglichen werden. Die von gestern zu heute neuen Dateien, sollen nach einander geladen werden. Das geschieht über eine Batchdatei.
    3. Leider kann ich kein Script anfügen da er auf Arbeit ist.
    4.Das was lüft ist der Teile mit der Markierung, Speicherung. Wo ich hilfe benötig ist der Teil mit dem Vergleichen und einzeln zum Download bereitzustellen.
    5. Die Löschung der alten Datei denke ich bekomme ich auch hin.

    mfg Thomas

    MFG ThomasB

    *
    Ich lese viel und gerne (und wenn ich alle Mahnungen durch habe, schmeiße ich sie weg)
    *

    • Offizieller Beitrag

    Hi,

    zu 4. wie sollen die Dateien den genau verglichen werden?

    Wenn du das fertig hast, dann könntest du dies nutzen, um den Download zu vereinfachen :

    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #Include <Array.au3>

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

    $FileList=_FileListToArray(@ScriptDir, "*.txt", 1)
    If @Error=1 Then
    MsgBox (0,"","No Files\Folders Found.")
    Exit
    EndIf
    _ArrayDisplay($FileList,"$FileList")

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

    zipTXT($FileList)

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

    Func zipTXT($files_A)
    $oShell = ObjCreate("Shell.Application") ; Create s shell Object
    $ZipAchive = @ScriptDir & "\" & 'download.zip'
    If IsObj($oShell) Then
    initZip($ZipAchive) ; Create an emtpy zip file with header
    $oDir = $oShell.NameSpace($ZipAchive) ; Use the zip file as an "Folder"
    For $i = UBound($files_A)-1 To 1 Step - 1
    $oDir.CopyHere(@ScriptDir & "\" & $files_A[$i]) ; Copy the files in the "Zip Folder"
    Next
    Sleep(700) ; Give the Objekt a litte bit time to work
    Else
    MsgBox(0, "Error", "Error creating Object.")
    EndIf
    EndFunc ;==>zipTXT

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

    Func initZip($zip_path_name)
    $init_zipString = Chr(80) & Chr(75) & Chr(5) & Chr(6) ; Create the Header String
    For $n = 1 To 18
    $init_zipString = $init_zipString & Chr(0) ; the Header
    Next
    $file = FileOpen($zip_path_name, 2)
    FileWrite($file, $init_zipString) ; Write the string in a file
    FileClose($file)
    EndFunc ;==>initZip

    [/autoit]

    So long,

    Mega

  • He da hab ich ja ne heisse diskusion ausgelöst ;)

    also das mit dem fc hört sich schonmal recht brauchbar an dummerweise klappt das noch nicht so mit den umlauten.

    Also meine lösungsidee ist einfach ich vergleiche den unterschied der offline datei mit der auf dem server und schreibe dann den unterschied der offlinedatei zu der serverdatei hinzu somit müsste ich ja automatisch die neuste version der datei auf dem server haben dann hat diese auch den letzten schreibzugriff und ich brauche diese dann nur noch mit der offlineversion syncen.

    Ich bastle mal und meld mich sobald ich was raus hab.... danke schonmal

  • Also das Funktioniert auch nicht so ganz wie ich mir das vorstelle im kopf hab ich jetzt die lösung nur fehlt mir noch das coden.

    Angesichts der Tatsache das die neuen einträge in der textdatei immer unten angehängt werden müsste das so ablaufen.

    Linienweise die dateien einlesen. Miteinander vergleichen.
    Ab dem moment wo die linien unterschiedlich sind eine neue datei erstellen die alles enthält den text in dem beide dateien gleich sind und die linien die unterschiedlich sind dann brauch ich nur noch die datei auf dem server ersetzen und diese dann mit dem laptop syncen.

    Also wer da so nen code im kop hatt wär ich dankbar mir geht langsam der schmalz aus ;)