# Textdatein umformatieren mit Java



## Domme (18. Okt 2011)

Hallo ich möchte mittels eines Java-Programms 2 Textdateien zu einer kombinieren:

Die erste hat folgenden Inhalt:

A01
A01
A01
A01
A01
A01
A01
A01
A02
A02
A02
A02
A02
A02
A02
A02
A02
A02

Die zweite diesen Inhalt:

12122
344334
343433
5454
56456
345345
234342
45345
23423
8566
56765
34234
5546
12122
5454
232
32432
2344

Daraus möchte ich eine Textdatei genierieren, aus der ersten Datei nur die ungleichen Zeilen untereinandergeschrieben werden und die Zahlen durch ein Zeichen getrennt dahinter
Das Ergebnis sollte  wiefolgt aussehen:

A01 ; 12122 #344334 #343433 #5454 #56456 #345345 #234342 # 45345
A02 ; 23423 #8566 #56765 #34234 #5546 #12122 #5454 #232 #32432 # 2344

Dafür habe ich bisher folgendes Programm geschrieben:


```
import java.io.*;
public class dateieinleser {

	public static void main(String[] args) throws IOException
	  {	    
		  FileWriter fw = new FileWriter("output.txt"); //Datei in die geschrieben wird
		  BufferedWriter bw = new BufferedWriter(fw);
		  FileReader fr1 = new FileReader("test1.txt"); //Datei mit Referenz	   
		  BufferedReader br1 = new BufferedReader(fr1);	    
		FileReader fr2 = new FileReader("test2.txt"); //Datei mit Nummern für Zuordnung
	    BufferedReader br2 = new BufferedReader(fr2);
	    String zeile = "A";
	    String zeile1 = " ";
	    String zeile2 = "";
	    	  
	    for(;(zeile = br1.readLine()) != null; zeile2 = br2.readLine() ){//Ueberprueft ob die erste Datei noch nicht zu Ende ist
	    	   	
	      if(!zeile.equals(zeile1)){	    		  
	    	  bw.write("\n" +  zeile + " ; ");
              System.out.println(zeile);
	    	  	    	  	             	      	}
	    	  else  
	    	  {
	    	            bw.write( zeile2 + " #" );
		             System.out.println(zeile2);
	            }
    	
	    	zeile1 = zeile;
	   }

	    br1.close();
	    br2.close();
	    bw.close();
	  }
	
}[/Java]

Dummerweise wird, wenn ich das Programm ausführe, immer der letze Eintrag aus der 2ten Datei abgeschnitten, d.h. das Ergebnis sieht wiefolgt aus:

A01 ; 12122 #344334 #343433 #5454 #56456 #345345 #234342 #
A02 ; 23423 #8566 #56765 #34234 #5546 #12122 #5454 #232 #32432 #

Ich komme an dieser Stelle einfach nicht allein weiter und wäre sehr dankbar für eine Hilfestellung!
```


----------



## SlaterB (18. Okt 2011)

wenn
>  if(!zeile.equals(zeile1)){
erfüllt ist, schreibst du eine neue Zeile mit 'zeile' am Anfang, sonst nix, 
den aktuellen Wert 'zeile2' ignorierst du, schreibst du weder in die alte noch in die neue Zeile der Ergebnisdatei,
irgendwas musst du sicher tun


ist dies so schwer selber herauszufinden? bedenklich, denn das ist eine extrem wichtige Programmierfähigkeit,
ganz in Ruhe Befehl für Befehl anschauen, mit System.out.println() loggen wie du ja schon einiges hast,
wann wird welcher Eintrag gelesen, was passiert damit?
mit dieser Grundfrage und dann Verfolgung im Code findet sich so ein Fehler eigentlich von selber


----------



## Domme (18. Okt 2011)

Hallo!
@ SlaterB: erstmal vielen Dank für die extrem schnelle Antwort!!!

Ich habe leider noch nicht so viel Erfahrung mit dem Programmieren gesammelt. Daher auch die Frage.

Was die Antwort betrifft, bin ich mir nicht sicher. Ich möchte am Ende Textdatei haben, die ich in eine Datenbank einlesen kann in der Steht Zeile1 ; Zeile2 # Zeile2  #usw. (Ähnlich einer Pivottabelle. Die erste Textdatei ist eine Spalte aus der Tabelle und die zweite Datei die andere Spalte ; soll als Trennzeichen dienen und das # als Trennzeichen für weitere Zwecke)

Ich habe mir in der zwischenzeit so geholfen, dass ich auch bei Erfüllung der if-Bedingung die Aktuelle Zeile aus Text2 in die neue Datei schreibe:


```
if(!zeile.equals(zeile1)){
	    	  bw.write( zeile2  );
	    	  System.out.println(zeile2);
	    	  bw.write("\n" +  zeile + " ; ");
              System.out.println(zeile);
```

auf diese weise bekomme ich das richtige Ergebnis.

Das einzige Problem, was jetzt noch bleibt, ist, dass der letze Eintrag aus der 2. Datei nicht geschrieben wird.

Ich gehe davon aus, dass es an der Abbruchbedingung : 
	
	
	
	





```
for(;(zeile = br1.readLine()) != null; zeile2 = br2.readLine() + " |")
```
 liegt.

Abruchkriterium ist dadurch ja, dass die erste Datei zu Ende ist.
ist es eine Möglichkeit die "while"-Schleife noch ein weiteres Mal zu durchlaufen, nachdem die Datei schon zu Ende ist?


----------



## SlaterB (18. Okt 2011)

mache vielleicht wirklich erstmal eine while(true){ ... }-Schleife draus,
zu Beginn jeden Durchlaufs kannst du einlesen, prüfen wie du lustig bist (Abbruch mit break; oder return; z.B. wenn beide Zeilen null sind),
gegebenenfalls auch noch Zähler erhöhen um bestimmte Anzahl Durchläufe nach null noch auszuführen,
vieles möglich, ja


----------

