# Spalte einer Textdatei einlesen



## coffeejava1987 (27. Okt 2011)

Hallo,

ich habe folgende Textdatei gegeben:



> 23.10.2011                                                                                                             Analyse                                                                                                                     4
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> Tests
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> ...




Die Textdatei:

datei.TXT

Es sind in der echten Datei auf meinem Rechner eigentlich noch mehr Datensätze als nur zwei Stück. Die Datei, die ich hochgeladen habe, ist zum Testen gedacht..  

Ich möchte die Datensätze der Spalte Name haben (und diese dann in eine ArrayList<String> speichern, aber first things first...). 

Versucht habe ich folgenden Code:


```
FileReader file;
		String line = "";
		try {
			file = new FileReader("C:/Daten/datei.TXT");
			BufferedReader reader = new BufferedReader(file);
			int counter = 0;
			while ((line = reader.readLine()) != null) {
				counter++;
				if(counter > 6)
				{
					String[] sep = line.split("|");
					System.out.println(sep[12]);
				}
			}
		} catch (FileNotFoundException e) {
			throw new RuntimeException("File not found");
		} catch (IOException e) {
			throw new RuntimeException("IO Error occured");
		}
```

Aber damit funktioniert es nicht, die Ausgabe ist leer. Kann mir jemand helfen, wie ich an die Datensätze von der Spalte Name rankomme?


----------



## SlaterB (27. Okt 2011)

du hast eine Datei mit kaum 6 Zeilen und einen Code der die ersten 5-7 Zeilen ignoriert und fragst nach dem Problem?

gib doch jede Zeile aus, den aktuellen counter-Stand, überprüfe das if usw.,
schaue dir ganz exakt an, was in jedem Schritt passiert, System.out.println() oder Debugger,
damit kann man sowieso 95% aller Fehler finden

falls die Datei nicht gefunden wird oder einen ganz anderen Inhalt hat, wird das auch gleich mit herausgefunden,
einfach alles klärt sich durch Untersuchung, dafür ist Untersuchung ja schließlich erfunden worden


----------



## coffeejava1987 (27. Okt 2011)

Hi SlaterB,

ich schrieb oben, dass die Datei eigentlich weitaus größer ist. Das ist lediglich ein Ausschnitt.

Die hochgeladene Datei besteht aus 8 Zeilen. Mich interessiert aber alles, was nach Zeile 6 kommt, da hier die Datensätze folgen. 

Dieser Code ...


```
FileReader file;
		String line = "";
		try {
			file = new FileReader("C:/Daten/datei.TXT");
			BufferedReader reader = new BufferedReader(file);
			int counter = 0;
			while ((line = reader.readLine()) != null) {
				counter++;
				if(counter > 6)
				{
					String[] sep = line.split("|");
					System.out.println(line);
				}
			}
		} catch (FileNotFoundException e) {
			throw new RuntimeException("File not found");
		} catch (IOException e) {
			throw new RuntimeException("IO Error occured");
		}
```

gibt mir genau die Zeilen der Datensätze aus, so wie sie sind. Mich interessieren allerdings nur bestimmte Spalten, wie z.B. eben die Spalte Name. 

Obige Frage erneut: wie komme ich an die Spalte ran? Mein Code im 1. Beitrag funktioniert ja nicht.


----------



## SlaterB (27. Okt 2011)

was genau funktioniert denn daran nicht? von irgendwo eine Datei downloaden ist nicht so lustig,
kannst du hier auch an Postings anhängen,

aber ich glaube ich habe es jetzt gefunden: | ist ein Sonderzeichen in regulären Ausdrücken, besser so:

```
public class Test
{
    public static void main(String[] args)
    {
        String line = "| 20 |EN |3454374 |124 |Y008 |348 |005 |008|09.10.2011|13.10.2011|CFX | 20|007DEF|Java-Anfang |Blau | 23,20 | 40 |";
        String[] sep = line.split("\\|");
        System.out.println(Arrays.toString(sep));
        System.out.println(sep[12]);
    }
}
```
schau dir die Array-Ausgabe unbedingt an um zu erkennen, welchen Index du brauchst


----------



## coffeejava1987 (27. Okt 2011)

Erstmal Riesendanke, dass du mir hilfst!

So, nun registriert und die Datei. Habe deinen Code getestet, aber war damit auch nicht erfolgreich. 

Welches Array sollte an dieser Stelle stehen? 

```
System.out.println(Arrays.toString(sep));
```


----------



## Andi_CH (27. Okt 2011)

So?

```
public class ReadFile {

	public static void main(String[] args) {
		FileReader file;
		String line = "";
		try {
			file = new FileReader("C:/Daten/datei.TXT");
			BufferedReader reader = new BufferedReader(file);
			int counter = 0;
			while ((line = reader.readLine()) != null) {
				counter++;
				if(counter > 6)
				{
					String[] sep = line.split("[|]");
					System.out.println(sep[1].trim());
				}
			}
		} catch (FileNotFoundException e) {
			throw new RuntimeException("File not found");
		} catch (IOException e) {
			throw new RuntimeException("IO Error occured");
		}
	}
}
```


----------



## coffeejava1987 (27. Okt 2011)

@Andi_Ch:

Funktioniert perfekt. :toll: Dankeschön!

Für die Zukunft.. Wie komme ich drauf, dass ich es so machen muss? 


```
String[] sep = line.split("[|]");
sep[1].trim()
```


----------



## SlaterB (27. Okt 2011)

mit \\| ginge es genauso, 
da muss man wie gesagt Reguläre Ausdrücke in Java lernen, split() verwendet diese,
manche Sonderzeichen reagieren unerwartet, besonders . (Punkt)

> Habe deinen Code getestet, aber war damit auch nicht erfolgreich. 

hast du meinen Code komplett kopiert und dann ging Datei einlesen nicht mehr?
war doch nur ein Beispiel für einen String direkt im Quellcode..,
egal


----------



## Milo (27. Okt 2011)

Hi,

indem Du Dir genau anschaust, was in den Zellen des Arrays drin steht (inkl. der Leerzeichen). Eine möglichkeit ist:


```
System.out.println("#" + sep[1] + "#");
```

Wenn zwischen der # und der Zahl noch Platz ist, sind des mehr als nur die beiden Zeichen 2 und 0.

Gruß Micha


----------



## Andi_CH (28. Okt 2011)

SlaterB hat gesagt.:


> mit \\| ginge es genauso,


Das glaube ich dir sofort, nur ist mir nicht klar warum mit "|" der String in Einzelzeichen separiert wird.



SlaterB hat gesagt.:


> da muss man wie gesagt Reguläre Ausdrücke in Java lernen, split() verwendet diese, manche Sonderzeichen reagieren unerwartet, besonders . (Punkt)



Ich gebe zu, dass ich auch nur gebastelt habe - Regex ist (und wird es wohl auch bleiben ;-) ) der nackte Horror für mich - Java hat ein Verständnis davon, jede Unix/Linux-Shell ein anderes und sed ein drittes :bahnhof:


----------



## SlaterB (28. Okt 2011)

split mit "" trennt auch nach jeden Zeichen, das ist | als Alternative zwischen nichts und nichts zumindest analog passend


----------

