# TextFileSplitter Aufgabe



## Wolfgang, 43 (15. Okt 2010)

Moin,
Ich sitzte jetzt schon seid Tagen an einer Aufgabe fürs Studium und komme zu keinem brauchbarem Ergebnis. Vieleicht könnt Ihr mir ein wenig auf die Sprünge helfen.
Aufgabe:

Definieren Sie eine Klasse TextfileSplitter, die eine Textdatei liest und in mehrere Ausgabedateien kopiert. Bestimmte Zeilen beginnen jeweils eine neue Ausgabedatei. Die Ausgabedateien heißen genauso wie die Eingabedatei, wobein ein Punkt und eine dreistellige, fortlaufende Nummer ab 000 angefügt wird.
Eine konkrete Implementierung der in TextfileSplitter abstrakten Methode

```
boolean splitAt(String line)
```
entscheidet, ob mit line eine neue Ausgabedatei beginnt (Ergebnis true) oder nicht (Ergebnis false).
Das nachfolgende Programmfragment trennt die Eingabedatei an Zeilen, die mit dem Buchstaben "s" beginnen, in Teildateien auf:

```
new TextfileSplitter() {
boolean splitAt(String line) {
return line.startsWith("s");
}
}.split("input.txt");
```


Zum Beispiel wird die folgende Eingabedatei
abra
ka
dabra
sim
sala
bim

zerlegt in die Ausgabedateien:
input.txt.000:
abra
ka
dabra
input.txt.001:
sim
input.txt.002:
sala
bim

-------------------------------------------------------------------------------------------------------
Meine bisherige Implementierung:


```
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;


public class TextfileSplitter {

	static Writer fw = null;
	
public static void createTxt(int txtCount, String Text) {//erstellt neue .txt
		  			
			try 
			{ 
			  fw = new FileWriter( txtCount+"TextAusgabe.txt"); 
			  fw.write( Text ); 
			  fw.append( System.getProperty("line.separator") ); // e.g. "\n" 
			} 
			catch ( IOException e ) { 
			  System.err.println( "Konnte Datei nicht erstellen" ); 
			} 
			finally { 
			  if ( fw != null ) 
			    try { fw.close(); } catch ( IOException e ) { } 
			}
		  	  
	}
	
public static boolean splitAt(String line) {//Soll abstract sein. Läuft aber noch nicht!!
//Enthält die Bedingung, für welche eine neue .txt erstellt werden soll.
	
	if (line.startsWith("s")){return true;}
	
	return false;
}

public static void addText(String Text){//Soll Text einer bestehenden .txt hinzufügen
		
	try {
		fw.write(Text);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}	
}		
}
```

main-class:

```
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class main extends TextfileSplitter {

	public static void main(String[] args) throws IOException {

		BufferedReader ein = new BufferedReader(new FileReader(args[0]));// TXT
																			// einlesen
		String zeile = ein.readLine();
		int count = 0;// txt-counter...

		while ((zeile = ein.readLine()) != null) {

			if (splitAt(zeile) == true) {
				count++;
				createTxt(count, zeile);// neue txt werd erstellt
										// "1TextAusgabe", "2TextAusgabe"...etc.

			} else {addText(zeile);}// zeile muss in der zuletzt erstellen .txt geschrieben werden
					               //NullPointerException bei der bisherigen implementierung

			}

		}
	}
```


Beim Ausführen erhalte ich folgendes Ergebnis:

EINGABE:
Eingabe.txt:
abra
ka
dabra
sim
sala
bim

zerlegt in die AUSGABE:
0TextAusgabe.txt:
abra
1TextAusgabe.txt:
sim
2TextAusgabe.txt:
sala



Vieleicht findet sich ja einer, der Interesse an meinem Problem hat. Danke schonmal im Voraus.
Liebe Grüße,
Wolfgang


----------



## Wolfgang, 43 (15. Okt 2010)

Problem erledigt! Hab grad noch ne Hardcoresession eingelegt und bin selbst drauf gekommen.


----------



## Shu (19. Okt 2010)

[Und wie hast du es hin bekommen? Und wie hast du das mit dem SplitAt gemacht, das sollte ja abstract werden?]


----------

