# Zwei Dateien vergleichen



## Mutaro (18. Juli 2008)

Hi,

habe mir nun schon so einige Beiträge durchgelesen die mit dem Thema zu tun haben, bin leider trotzdem nicht auf die Lösung gekommen. Folgendes Problem: 2 Dateien werden eingelesen und sollen auf übereinstimmende Datensätze geprüft werden..... Bitte nicht lachen wenn ihr den Code dazu anschaut, im Moment werden nur beide Dateien eingelesen und in Tokens verarbeitet. Mach das erst seit ner Woche und bräucht da echt Hilfe.

```
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;




public class TestFile1 {
				public static void main(String[] args) {
				FileReader fr = null;
				
				
				try{
					BufferedReader in = new BufferedReader(fr = new FileReader("Pfad.txt"));

					int zeilennummer = 0;
					for (String line; (line = in.readLine()) != null;zeilennummer++) {
						//Ausgabe der ganzen Zeile
						System.out.println(line);
						
						if (zeilennummer > 4)
						{
						
							
							int doppelpunkt = line.indexOf(":");
							if (doppelpunkt > 0)
							{	System.out.println(line.substring(0, doppelpunkt-1));}
							
							
							if (doppelpunkt > 0)
							{
								int leerzeichen = line.indexOf(" ", doppelpunkt);
								System.out.println(line.substring(doppelpunkt+7, leerzeichen));
							}
							
							
							
							if (doppelpunkt > 0)
							{
								ArrayList liste = new ArrayList();
							
								int position = 0;
								
								do
								{
									position = line.indexOf("H(", position + 1);
									
									if (position > 0)
									{
										System.out.println("Kanal: "+line.substring(position + 2, line.indexOf(")", position)));
									}
								}
								while (position > 0 && position <= line.length());
							}
						}
					}
				}
				
				catch (IOException e) {
					System.err.println(e);
				} 
				finally {
					if (fr != null);
					try {
						fr.close();
						} 
					catch (IOException e) {
					}
					
				}
					FileReader fr2 = null;
					//Zweite Datei einlesen
					try{
						BufferedReader in2 = new BufferedReader(fr2 = new FileReader("Pfad.csv"));
						
						int ZeilenNr = 0;
						
						for (String line2; (line2 = in2.readLine()) != null;ZeilenNr++) {				
							StringTokenizer tokenizer = new StringTokenizer(line2, " ;,, ");				
							
						
							int Zeichenlänge = line2.length();
							if(ZeilenNr > 3){
							while (tokenizer.hasMoreTokens()) {					
								
								if (Zeichenlänge == 9){
								System.out.println("Site: " + tokenizer.nextToken());				
								}		
								
								else if (Zeichenlänge == 1){
										System.out.println("Sektor: "+ tokenizer.nextToken());
									}
								
								
								else {
											System.out.println("Kanal:" + tokenizer.nextToken());
										}
								}
							
							}
						}
					}
					
					catch (IOException e) {
						System.err.println(e);
								} 
					
						finally {
						if (fr != null);
							try {fr.close();
								} 
							catch (IOException e) {
								}
						}
					
					
					
				}
}
```


----------



## hammet (18. Juli 2008)

Benutze doch bitte die Code-Tags.
Desweiteren, wo liegt denn jetzt genau dein Problem? (Hab mir den Quellcode nicht angeschaut, werde ich auch nicht, bevor er nicht in Code-Tags eingebunden ist)

//Edit Danke Sascha


----------



## zerix (18. Juli 2008)

Hallo,

ich bitte dich, nächstes mal einen treffenderen Titel zu wählen, da dieses Thema vielleicht auch anderen Usern helfen kann. Ich war mal so frei und hab den Titel mal geändert. 

Nutze auch nächstes mal die Code-Tags. Dazu kannst du entweder die '#' in der Toolbar nutzen oder die Code-Tags die ich bei dir eingetragen hab. Wenn du deinen Beitrag editierst, siehst die welche.

MFG

Sascha


----------



## Mutaro (18. Juli 2008)

Oh, entschuldigung war mein erster Beitrag in dem Board hier. Werde nächstes mal dran denken, danke fürs Ändern.
Also das Problem liegt nun beim Vergleichen der Dateien und eben ist mir aufgefallen dass der fr2 nicht wirklich funktioniert.... warum auch immer.


mfg


----------



## Looky (18. Juli 2008)

Moin,

erstmal würde ich aus dem Einlesevorgang eine Methode machen um redundanten Code zu vermeiden.

So,  und um Missverständnisse zu vermeiden. Du hast Datei a, die hat Datensätzen, die mit einem ; getrennt sind. Und nun willst du gucken ob einer der Datensätze auch in Datei b vorkommt und wenn das so ist, gibt es für den Datensatz ein true zurück, ansonsten ein false, richtig? Kannst ja mal zum testen einen kleinen Teil von Datei a und Datei b posten.

Gruß
Christian


----------



## Zanderfilet (18. Juli 2008)

Moin...
ich wäre denn mal so frei weiterzufragen;-)
Irgendwie kommt mir die Aufgabe aus der Uni bekannt vor...verdammt lang her...sowas wie...welche abschnitte/worte aus märchen A kommen auch in Märchen B vor? ;-)

Ich würde mir also erstmal überlegen was identisch an den Datensätzen sein soll...also identische Worte, worte im kontext oder was auch immer!

wenn nur worte...recht easy...einfach beide dateien als string einlesen (sonderzeichen wie komma, punkt etc einfach mal überlesen(den wert dieser zeichen findest in jeder ascii tabelle..mal googeln)
, über beide nen tokenizer, erstes element tokenizer A mit allen TokenizerB per equals abgleichen , gefundene identische auf nen array setzen, wenn längere text teile überpfüft werden sollen noch länge des tokens und position merken (einfach ne Klasse basteln mit nem String, und zwei int's für position und länge), dann die Objekte im array speichern.

Zack bumm...schon solltest alle identischen zeichenketten mit deren position und länge haben.

der Zander


----------



## Mutaro (18. Juli 2008)

Ok ein kleines Beispiel... Inhalt Datei a (ist .csv)

508301009	3	1	15	1001,1002,1003,1004,1005,1006,1007,1016,1017,1018,1019,1020,1021,1022,1023

Und Datei B, Inhalt (txt)
509301183 1              0          1020                         1          1020

Hab jetzt mal alles was aus Datei B durchs Programm rausgenommen wird bereits entfernt.

Irgendwie sollte jetzt je eine ZEile von B eingelesen werden und mit allen von A auf Übereinstimmungen abgeglichen werden.

@Zander

Nein leider sinds nur Zahlenfolgen, und das nächste Problem das mir gerade aufgefallen ist dass es zwei mal nur 1 Zeichen ist was heißt dass ich mit if bla == 1 Nicht weit kommen werde


----------



## Looky (18. Juli 2008)

Mutaro hat gesagt.:


> Irgendwie sollte jetzt je eine ZEile von B eingelesen werden und mit allen von A auf Übereinstimmungen abgeglichen werden.



und du meinst das die Leerzeichen in dieser Zeile



> 509301183 1 0 1020 1 1020



bedeuten, das jede Zahl, die per Leerzeichen getrennt wurde eine eigene Zeile darstellt? Sprich also eigentlich so:

```
509301183 
1 
0 
1020 
1 
1020
```


----------



## Mutaro (18. Juli 2008)

Ah jo sorry hätte es auch gleich durch Zeilenumbruch verdeutlichen können sorry. Ja sind alles einzelne Zeichen bzw. Zeichenketten.


----------



## Looky (18. Juli 2008)

ok und wo ist dann das problem die beiden Arrays durchzugehen in der Art:


```
for(int i=0;i<Array1.length();i++){
 for(int x=0;x<Array2.length();x++){
   if(Array1[i] == Array2[x]){
       System.out.println("Wert: "+Array1[i]+" hat einen treffer gefunden!!");
       break;
    }
 }
}
```


----------



## Mutaro (18. Juli 2008)

Wahrscheinlich ist dabei kein Problem, wie gesagt ich mach das erst seit einer Woche und komm noch nich so schnell auf gute Ideen. Nächste Problem könnte sein, dass die Dateien gar nicht in Arrays eingelesen werden. Aber is ne gute Idee, danke.

//Edit: Ehm, wird da jetzt auf die länge des Arrays überprüft? Also es muss schon ne komplette Zeichenfolge übereinstimmen wie zb. Bei den 9-Stelligen Zahlen.


MFG


----------



## Looky (18. Juli 2008)

Hm, ich würds vielleicht so machen. (Habs nicht getestet, habs einfach so runtergetippt, also keine Garantie )


```
package de.museek.sandkasten;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Vector;


public class JavaForum {
	
	public Test(){
		Vector<String> content_1 = fillVector("c:\\test1.txt");
		Vector<String> content_2 = fillVector("c:\\test2.txt");
		
		for(int i=0;i<content_1.size();i++){
			 for(int x=0;x<content_2.size();x++){
			   if(content_1.get(i) == content_2.get(x)){
			       System.out.println("Wert: "+content_1.get(i)+" hat einen treffer gefunden!!");
			       break;
			    }
			 }
			}
	}
	
	private Vector<String> fillVector(String filename){
		try {
			//Einlesen
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filename))));
			StringBuffer buffer = new StringBuffer();
			String line;
			while( (line = reader.readLine()) != null){
				buffer.append(line);
			}
			reader.close();
			
			//Konvertieren und als Vector speichern
			StringTokenizer tokenizer = new StringTokenizer(buffer.toString(), " ;,, ");
			
			Vector<String> result = new Vector<String>();
			while(tokenizer.hasMoreTokens()){
				result.add(tokenizer.nextToken());
			}
			return result;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	
	public static void main(String[] args) {
		new JavaForum();
	}
}
```


----------



## Mutaro (18. Juli 2008)

Muss ganz ehrlich sagen, sieht ja schön aus aber ich kapier jetzt grad gar nich was genau der Code jetzt macht.


----------



## Looky (18. Juli 2008)

Naja, in Z. 27 ist ne Methode zum einlesen der Datei. Die daten werden direkt in einen Stringbuffer geschrieben. Anschließend werden die Inhalte des Stringbuffers mit Hilfe des Tokenizers gesplittet.

die fertigen Zeilen übergebe ich dann an die beiden Vetoren im Konstruktor und dann werden die beiden Vectoren bzw die Zeilen verglichen.

Hab ich da was falsch verstanden?
Gruß
Christian


----------



## Mutaro (18. Juli 2008)

Achso, aber nun werden die Zeilen nicht mehr zerlegt oder? Also müsste ich da irgendwo nochmal meine ganzen If Anweisungen einbauen denn ganze Zeilen können leider nicht verglichen werden weil die Zeichenfolgen in Dat A und B völlig verschieden sind. Also nicht völlig verschieden aber die Zeichenfolgen die verglichen werden sollen werden eben in der einen Datei noch von Wörtern, Klammern und Doppelpunkten unterbrochen.
zb. in Datei A siehts so aus: 12345678 
                                           1
sieht in Datei B so aus:
12345678ABlabla:1
es sollen aber nur die 12345678 und die 1 einzeln verglichen werden.


----------



## Looky (18. Juli 2008)

jo, dann mach doch in die while sc hleife des tokenizers einfach eine prüfunhg ob es sich um ints handelt.


----------



## Zanderfilet (18. Juli 2008)

Also für den Fall das Du nur Zahlen suchst:


```
.....

String[] gesuchtezeichen = new String[10];
for(int temp = 0;temp<10;temp++){
    gesuchtezeichen[temp]=String.valueOf(temp);
}
     
StringTokenizer tokenizer = new StringTokenizer(buffer.toString(), ""); 
Vector<String> result = new Vector<String>();            
while(tokenizer.hasMoreTokens()){                
for(int temp2=0;temp2<temp.length;temp2++){
   String eingelesenesZeichen = tokenizer.nextToken();
   if(eingelesenesZeichen.equals(gesuchtezeichen[temp2]){          
            result.add(eingelesenesZeichen);      
    }
        
}           
return result;
.....
```

So dürften dann alle Zeichen ausser denen die Du suchst(in dem Fall Zahlen) in dem jeweiligen Vector gespeichert werden...


----------



## Zanderfilet (18. Juli 2008)

Hups kleiner Gedankenholpler...besser so;-):


```
Vector<String> result = new Vector<String>(); 
String eingelesenesZeichen;           
while(eingelesenesZeichen=tokenizer.nextToken!=null)){                
for(int temp2=0;temp2<temp.length;temp2++){
      if(eingelesenesZeichen.equals(gesuchtezeichen[temp2]){          
            result.add(eingelesenesZeichen);      
    }
        
}           
return result;
```


----------



## zerix (18. Juli 2008)

Nutze statt dem Vector lieber eine ArrayList. Die ist vom Zugriff her wesentlich schneller.

MFG

Sascha


----------



## Mutaro (18. Juli 2008)

Also ich habe etwas rumgetüftelt, wie ja schon gesagt wurde wäre es sinnvoller beide Dateien in einer Methode einzulesen. 
Ich habe jetzt trotzdem erstmal zwei Methoden gelassen weil mir die Zeit fehlt alles nochmal neu zu schreiben denn die Aufgabe müsste in ca. 4 std fertig sein.
Habe nun versucht beide Dateien in Arrays einzulesen und diese miteinander zu vergleichen jedoch bin ich mir nicht wirklich sicher wo genau ich die Arrays einbauen muss.


mfg


----------



## Looky (18. Juli 2008)

Ich will dich echt nicht angreifen, aber da du offensichtlich keine bis wenig Vorwissen in Java mitbringst ist es recht schwierig dir zu helfen. Wenn du dir die beiden Beispiele oben mal genau ansiehst, dann wirst du feststellen, dass der meiste Code eigentlich schon geschrieben wurde...

Gruß
Christian


----------



## Mutaro (18. Juli 2008)

Naja wieviel Vorwissen kann man sich in einer Woche aneignen.

Trotzdem danke für die Hilfe.

mfg


----------

