Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Dateien blockweise vergleichen

  1. #1
    Registrierter Benutzer
    Registriert seit
    Jun 2005
    Beiträge
    10

    Dateien blockweise vergleichen

    Hallo Leute.

    Mein Problem sieht folgendermaßen aus:

    Ich habe 2 verschiedene Thunderbird Inbox Dateien, mit unterschiedlichen Inhalt.
    Da mir diff und comm nicht weitergeholfen haben, frage ich nun euch, ob es da schon was fertiges gibt, da ich das Rad nicht neu erfinden möchte .

    Also...

    Eine Mail in einer Inbox Datei sieht folgendermaßen aus:
    Code:
    From - Sun Jan 16 01:02:49 2005
    X-Account-Key: account3
    X-UIDL: b2611ee7a3953a7da12a8967d783cc4e
    X-Mozilla-Status: 0001
    .
    .
    haufenweise blabla
    .
    .
    
    
    From - Sun Jan 16 02:01:41 2005
    X-Account-Key: account3
    X-UIDL: b2611ee7a3953a7da12a8967dwdwcc4e
    X-Mozilla-Status: 0001
    .
    .
    .
    Jetzt möchte ich den ganzen Block von "From - *" bis zum nächsten "From - *", bzw. falls die letzte Mail erreicht ist von "From - *" bis zum Dateieinde vergleichen (nicht Zeilenweise). Wenn der gesammte Block in der anderen Datei nicht existiert, soll dieser zwischengespeichert / in eine Datei geschrieben werden.

    Das Ziel ist es die fehlenden Mails der 1. Inbox Datei, die in der 2. aber existieren, in die 1. zu schreiben und die fehlenden Mails der 2. Inbox Datei, die aber in der 1. vorhanden sind in die 2. zu schreiben.

    Nochmal vereinfacht. Ich habe 2 Dateien, die wie folgt aussehen:

    1. Datei:
    Code:
    *Schlüsselwort*
    Eins
    Eins
    Eins
    Drei
    Drei
    
    *Schlüsselwort*
    Zwei
    Zwei
    usw.
    2. Datei:
    Code:
    *Schlüsselwort*
    Eins
    Eins
    Eins
    Drei
    Drei
    
    *Schlüsselwort*
    Vier
    Fünf
    
    *Schlüsselwort*
    Sechs 
    Sieben
    zum Schluss sollen beide Dateien folgenden Inhalt haben:

    Code:
    *Schlüsselwort*
    Eins
    Eins
    Eins
    Drei
    Drei
    
    *Schlüsselwort*
    Zwei
    Zwei
    usw.
    
    *Schlüsselwort*
    Vier
    Fünf
    
    *Schlüsselwort*
    Sechs 
    Sieben
    Ein zu vergleichender Block geht vom *Schlüsselwort* bis zum nächsten *Schlüsselwort*. Der nächste Block geht vom aktuellen *Schlüsselwort* bis zum nächsten und falls es sich um den letzten Block handelt, soll der Block vom *Schlüsselwort* bis zum Dateiende gehen.

    Vielleicht hat ja einer von euch so ein Problem schonmal gehabt und kann mir weiterhelfen. Scriptsprachen wie Perl oder PHP wären super, muss aber nicht sein

    Viele Grüße
    Panik

  2. #2
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    Sep 2002
    Beiträge
    783
    Bevor du dir zu viel Arbeit machst könntest du folgendes probieren:
    Den Inhalt beider Dateien aneinanderhängen und hoffen, dass Thunderbird doppelte Einträge ignoriert

    Falls es nicht funktioniert und du dann einige Mails doppelt hast kannst du die ja immernoch nach Datum sortieren lassen und musst dann eben manuell von den doppelten jeweils eine Mail selektieren und löschen...

    Abhängig von der Anzahl der Mails (um welche Größenordnung geht es hier?) ist das vllt. trotzdem die schnellste Lösung.

  3. #3
    Registrierter Benutzer
    Registriert seit
    Jun 2005
    Beiträge
    10
    Danke für die Antwort. Thunderbird ignoriert leider keine doppelten Mails. Das habe ich nämlich schon mal getestet .
    Und per Hand selektieren und löschen würde leider mehr Arbeit als Nutzen bringen, da es sich um eine Menge Mails handelt.
    Ich probier dann mal weiter.

  4. #4
    stitch Avatar von [CCCB]m0p
    Registriert seit
    Jul 2003
    Beiträge
    333
    ich würde es mit einem PHP-Script machen:

    die datei einlesen und per explode auf den string "From - " in ein / bzw zwei arrays einlesen. dann würde ich das erste array mit einer while-schleife und 'in_array vergleichen , danach das zweite... wenn in_array=false dann schreibe das ding in eine neue datei ansonsten nicht! die doppelten würde ich dann erst beim zweiten durchgang machen, weil die sonst wieder doppelt drin sind

    vlt bist du einer anderen programmiersprache mächtig, weswegen ich es allgemein gehalten habe!
    wenn nicht, kontaktier mich einfach mal per PM
    Geld verdienen? http://m0p.klamm.de

    ---------------------------
    Distribution: Debian Testing
    Kernel: 2.6.10
    Window-Manager: Fluxbox 0.9.13
    Grafiktreiber: fglrx v. 8.16.20 @ X.Org 6.8.2

  5. #5
    Registrierter Benutzer
    Registriert seit
    Jun 2005
    Beiträge
    10
    @[CCCB]m0p
    Danke für deine Antwort. Explode hat mir weitergeholfen, allerdings habe ich das jetzt etwas anders gelöst. Ich vergleiche die Message-IDs miteinander, da diese unique sind. Allerdings funktioniert dann in_array nicht mehr, also habe ich das zur Fuß gemacht.

    Code:
    function syncMyFiles($filename,$filename2)
    {
    	$handle = fopen($filename, "a+");
    	$handle2 = fopen($filename2, "a+");
    	
    	$contents = fread($handle, filesize($filename));
    	$contents2 = fread($handle2, filesize($filename2));
    	
    	$pieces = explode("From -", $contents);
    	$pieces2 = explode("From -", $contents2);
    	
    	for ($i = 1; $i < sizeof($pieces); $i++)
    	{
    		$isNew = 1;
    
    		preg_match("/(Message-.*: <.*>)/", $pieces[$i], $matches);
    		
    		for ($k = 1; $k < sizeof($pieces2); $k++)
    		{
    			preg_match("/(Message-.*: <.*>)/", $pieces2[$k], $matches2);
    			
    			if ($matches[0] == $matches2[0] && $matches[0] != "" && $matches2[0] != "")
    			{
    				$isNew = 0;
    				break;
    			}
    		}
    	
    		if ($isNew == 1) 
    		{
    			fwrite($handle2, "\n\nFrom -".$pieces[$i]."\n\n");
    			echo "writing new mail to file: $filename\n";
    		}
    	}
    	
    	for ($i = 1; $i < sizeof($pieces2); $i++)
    	{
    		$isNew = 1;
    		
    		preg_match("/(Message-.*: <.*>)/", $pieces2[$i], $matches);
    		
    		for ($k = 1; $k < sizeof($pieces); $k++)
    		{
    			preg_match("/(Message-.*: <.*>)/", $pieces[$k], $matches2);
    			
    			if ($matches[0] == $matches2[0] && $matches[0] != "" && $matches2[0] != "") 
    			{
    				$isNew = 0;
    				break;
    			}
    		}
    		
    		if ($isNew == 1)
    		{
    			fwrite($handle, "\n\nFrom -".$pieces2[$i]."\n\n");
    			echo "writing new mail to file: $filename2\n";
    		}
    	}
    	
    	fclose($handle);
    	fclose($handle2);
    }
    
    syncMyFiles("done","done2");

Ähnliche Themen

  1. Brennen von bin/cue Dateien unter Linux 2.6
    Von Zaphod-B im Forum Tipps und Tricks
    Antworten: 6
    Letzter Beitrag: 11.05.04, 23:50
  2. Versteckte Dateien auf CD nicht auffindbar!
    Von Silence im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 18.12.03, 23:36
  3. kann man dateien automatisch vergleichen?
    Von XXLRay im Forum Anwendungen Allgemein, Software
    Antworten: 12
    Letzter Beitrag: 22.09.02, 20:19
  4. Dateien mit bestimmtem Alter löschen
    Von Duck im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 26.08.02, 11:27
  5. Antworten: 2
    Letzter Beitrag: 17.08.02, 09:27

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •