Zwei Text-Files miteinander vergleichen

userpointio

Grünschnabel
Hi tutorials.de,

ich bin der Neue und falle gleich mal mit der Tuerr ins Haus:

Ich bin noch am Anfang meiner JAVA Karriere und habe bis dato nur ein sehr bescheidenes Know How und das Ganze hat sich
mir noch nicht so ganz erschlossen, weshalb ich mich durch Lektuere und Uebungen versuche zu verbessern.

Zunaechst moechte ich ein kleines Programm schreiben, welches zwei Logfiles miteinander vergleicht, welches nach und nach
ein wenig angepasst werden soll.
Differenzen sollen dabei in eine andere Datei geschrieben werden. Sprich:

FileA:
Code:
Line 1
Line 2
Line 3

und

FileB:
Code:
Line 1
Line 2
Line 2b
Line 3

werden verglichen. In FileC soll nach Ende der Operation "Line 2b" vorzufinden sein.

Ganz simpel also... jedoch nicht fuer nen Anfaenger :rolleyes:

Ich moechte FileA und FileB Zeilenweise einlesen, um das Programm Resourcenschonend laufen lassen zu koennen.

Was habe ich bis jetzt?

Code:
import java.io.*;

public class Abweichungen {

	public static void main(String[] args) throws IOException {
		
		String path1 = args[0];
		String path2 = args[1];
		
	      try {
	        BufferedReader a = new BufferedReader (new FileReader(path1) );
	        BufferedReader b = new BufferedReader (new FileReader(path2) );
	        String zeileA;
	        String zeileB;
	        
	        while (((zeileA = a.readLine()) != null) && ((zeileB = b.readLine()) != null)) {
	        	if (zeileA.equals(zeileB)) {
	        		System.out.println(zeileA);
	        		}
	        }
	        a.close();
	        b.close();
	      }
	      catch (IOException e) {
	        System.out.println("Fehler: "+e.toString());
	      }

	}
}

Die if-Anweisung vergleicht bereits beide Dateien die ich dem Programm uebergebe. Allerdings nur die erste Zeile und stoppt dann.
Mach ich aus der if-Anweisung, ne while-Schleife, endet das Ganze in einer Endlosschleife des ersten Eintrags...
An dieser Stelle bin ich dann mit meinem Latein am Ende... frage mich, ob ich auf dem richtigen Weg bin... weiss eben nicht so ganz weiter. :( Wuerde mich ueber Hilfe freuen. Doch bedenkt bitte, dass ich echt noch am Urschleim kratze!

EDIT: Okay, hab den Code oben ein wenig geaendert. Ich bin jetzt so weit, dass er mir die Zeilen ansatzweise vergleicht. Das Problem ist allerdings, dass er wirklich Zeilenweise vorgeht.
Sprich, wenn in FileA an erster Stelle "eins" steht. In FileB der Eintrag "eins" auch vorhanden ist,
allerdings nicht an erster Stelle, dann erkennt er auch nicht diese Gemeinsamkeit.
Was kann ich da tun?
 
Zuletzt bearbeitet:

Thinker

Mitglied
Hi tutorials.de,
Zunaechst moechte ich ein kleines Programm schreiben, welches zwei Logfiles miteinander vergleicht, welches nach und nach
ein wenig angepasst werden soll.
Differenzen sollen dabei in eine andere Datei geschrieben werden. Sprich:

...

EDIT: Okay, hab den Code oben ein wenig geaendert. Ich bin jetzt so weit, dass er mir die Zeilen ansatzweise vergleicht. Das Problem ist allerdings, dass er wirklich Zeilenweise vorgeht.
Sprich, wenn in FileA an erster Stelle "eins" steht. In FileB der Eintrag "eins" auch vorhanden ist,
allerdings nicht an erster Stelle, dann erkennt er auch nicht diese Gemeinsamkeit.
Was kann ich da tun?

Das ist ein Optimierungsproblem, das du sicher nicht selbst lösen möchstest, immerhin wurde es schon xmal gelöst.
Du kannst eine Diff-Library verwenden, die Texte zeilenweise vergleicht. Zum Beispiel http://code.google.com/p/java-diff-utils/, die kann einen "unified diff" für dich erzeugen.
 

sheel

I love Asm
@userpointio:
Denke, du solltest konkretisieren, was alles anders sein kann.

Wenn die Änderungen einfach ganze neu eingefügte Zeilen sind und sonst nichts
(keine Zeilen fehlen, Zeilen in sich wurden nicht geändert, Reihenfolge gleich...)
kann man das schon machen.

Ansonsten ist das, wie Thinker schon schreibt, wirklich alles Andere als trivial.
 

userpointio

Grünschnabel
Hi ihr beiden,
danke fuer eure Antworten.

@sheel:
So gesehen muss erst einmal gar nichts anders sein. Die Aussage bzgl. der Anpassung bezog sich
eher auf ein wenig Platz fuer den Ausbau des Programms in der Zukuft von mir, zwecks Uebungszwecken.
Die eigentliche Problemstellung habe ich ja oben bereits angerissen:
Ich moechte zwei Text/Logfiles miteinander vergleichen. In den Logfiles stehen nur Links.
Ein Suchpattern bspw. via URI ist daher nicht noetig.
Dabei sollen Differenzen in eine seperate Textdatei geschrieben werden. Dabei sollen unabhaengig
von der Zeilennummer, die Zeilen miteinander abgeglichen werden, und das auf einen moeglichst
performanten Weg.

Mit dem Link von Thinker konnte ich tatsaechlich leider auch noch nicht so viel Anfangen.
Der Algo war mir allerdings bekannt bzw. ich hatte von diesem schon bei meinen Internetrecherchen
gelesen.
 

youza

Erfahrenes Mitglied
Habs noch nicht in die tiefe getestet ist aber ein Ansatz:
Java:
package test;
import java.io.*;
import java.util.ArrayList;
 
public class Abweichungen {
 
    public static void main(String[] args) throws IOException {
        
        String path1 = args[0];
        String path2 = args[1];
        
          try {
            BufferedReader a = new BufferedReader (new FileReader(path1) );
            BufferedReader b = new BufferedReader (new FileReader(path2) );
            String zeileA;
            String zeileB;
            ArrayList<String> filea = new ArrayList<String>();
            ArrayList<String> diffs = new ArrayList<String>();
            while(((zeileA = a.readLine()) != null))
            {
            	filea.add(zeileA);
            }
            while (((zeileB = b.readLine()) != null)) {
            	if(!filea.remove(zeileB))
            		diffs.add(zeileB);
            }
            for (int i = 0; i < filea.size(); i++) {
				diffs.add(filea.get(i));
			}
            for (int i = 0; i < diffs.size(); i++) {
				System.out.println(diffs.get(i));
			}
            a.close();
            b.close();
          }
          catch (IOException e) {
            System.out.println("Fehler: "+e.toString());
          }
 
    }
}

Gruß
Youza