# TXT File einlesen unterschiedliche Zeilenlänge



## Anubis273 (27. Aug 2012)

Moin Zusammen,

ich hänge gerade an folgendem Problem fest:

Ich lasse mir ein TXT File einlesen und speichere mir die eingelesenen Werte in einem String Array.
Eine Zeile in dem TXT File besteht in der Regel also zu 98 % aus 6 Blöcken welche ich jeweils mit einem Split separiere. Das Textfile und Array sieht dann so aus:

aaa bbb ccc ddd eee fff

[0] [1]   [2]   [3] [4] [5]

Funktioniert soweit auch prima ! ABER: Wenn das Textfile nur die Länge:

aaa bbb ccc hat, läuft meine Methode in eine Exception. Jetzt habe ich natürlich schon anhand if Abfragen oder eine Prüfung auf "null" versucht das Problem zu umgehen, bislang leider ohne Erfolg.

Gibt es da eine elegante Lösung für dieses Problem ?

Schonmal vielen Dank im Voraus

Anubis273


----------



## Gast2 (27. Aug 2012)

Lies die Datei Zeilenweise ein (BufferedReader#readLine), und splitte jede Zeile dann beim Leerzeichen (deineZeile.split(" ")).
Dann ist es egal wieviele Blöcke in jeder Zeile vorkommen.


----------



## Marcinek (27. Aug 2012)

Bitte auf keinen Fall Code oder die Exception posten.


----------



## pappawinni (27. Aug 2012)

Bh.. ist natürlich schwer zu sagen, was du da falsch machst, so ganz ohne Code und Fehlermeldung.
Ich mutmaße einmal, dass du auf Array-Elemente zugreifen willst, die nicht existieren.
Du machst also vermutlich sowas 
	
	
	
	





```
String splitarray[] = strRead.split(" ");
```
Dann willst du wahrscheinlich auf Array-Elemente zugreifen und bekommst dann, wenn dein Array kürzer ist, als du dachtest, eine Exception.

Bevor du auf Arrayelemente zugreifst müsstest du in diesem Fall also prüfen, wieviele Elemente dein Array hat.


```
if (splitarray.length >= index+1)
{
  // Zugriff mit diesem index möglich
}
else
{
  // Bei dem index ist nichts worauf du zugreifen könntest
}
```


----------



## Anubis273 (27. Aug 2012)

Sehr richtig, ich speichere in mein input Array und greife auf die _ Stelle in diesem Array zu.
Wenn aber nun beim einlesen das TXT File weniger als 6 Blöcke hat und ich separierer ja mit split(" ")
dann gibts eine Out Of Bounds Exception

Hier mal mein Code dazu:



		Java:In die Zwischenablage kopieren


kernel = new String[zeilenZaehler];
			BufferedReader br1 = new BufferedReader( new FileReader("C:/READSLD/kernel.TXT")); 
			for (int i=0; i<1; i++) {			// Diese For Schleife sorgt dafür, dass im TXT File erst ab Zeile 2 gelesen wird !
			     br1.readLine();
			 } 
			while((zeile = br1.readLine()) != null) {  
				 input = zeile.split(" ");
	
				if ( input.length <= 2) {
					break;         // Funktioniert ! Ich möchte aber hiernach weiter einlesen !!! 
				}
								
				 kernel[zeilenNummer] = input[0] +"_" + input[1]+ "_" +input[4]+ "_"+ input[2]+ "_"+ input[3] + "_" +input[5];
				 System.out.println(kernel[zeilenNummer]);  // Gibt alle Kernel`s aus die in kernel.txt stehen !
				 zeilenNummer++;
					
			} 
				System.out.println("###################################################");
				System.out.println("Kernel´s erfolgreich ausgelesen !");
				System.out.println("###################################################");
				
		} catch (FileNotFoundException e) {           
				e.printStackTrace();  
				}
			catch (IOException e) {           
				e.printStackTrace();    
			}
			catch (ArrayIndexOutOfBoundsException e) {
				System.out.println("OUT OF BOUNDS in 'leseHost' Methode !"); 
			}
		}
	// ============================ Ende der einlese Methode ==============================================================================
	
	
}


Also bis zu meinem break; funktioniert alles natürlich ohne Exception, aber wie bringe ich die Methode dazu anstelle des break in der nächsten Zeile weiter zu lesen ?
Bin echt ratlos ???:L_


----------



## Michael... (27. Aug 2012)

Anubis273 hat gesagt.:


> Sehr richtig, ich speichere in mein input Array und greife auf die _ Stelle in diesem Array zu.
> Wenn aber nun beim einlesen das TXT File weniger als 6 Blöcke hat und ich separierer ja mit split(" ")
> dann gibts eine Out Of Bounds Exception
> ...
> ...


_
Wenn nur die Zeilen mit sechs Blöcken relevant sind, dann pack einrach nur diese in Dein "Sammel" Array - dazu gibt es die Möglichkeit Abfragen zu programmieren


		Java:In die Zwischenablage kopieren


if (input.length == 6) {
    kernel...


Um die erste Zeile eines Textfiles zu "überspringen" braucht man keine Schleife hier reicht einfach der einmalige Aufruf von readLine()_


----------



## pappawinni (27. Aug 2012)

Oh, Mann, das

```
kernel[zeilenNummer] = input[0] +"_" + input[1]+ "_" +input[4]+ "_"+ input[2]+ "_"+ input[3] + "_" +input[5];
```
muss doch schon in die Hose gehen, wenn die Länge < 6 ist.

und da verstehe ich schon zweimal nicht, warum du überhaupt splittest, wenn du den Käse nachher wieder zusammensetzt.
Da könnte man ja auch gleich nur die " " durch "_" ersetzen, oder?


```
if (input.length == 6) { 
  kernel[zeilenNummer] = zeile.replaceAll(" ","_");
}
```

Ok, ich muss ja auch nicht alles verstehen.

[EDIT]
Sorry, hab übersehen, dass du die Reihenfolge änderst.
Also von mir aus, splite, packe aber deine Montage dorthin, wo auch sichergestellt ist,
dass dein Array 6 Elemente hat.
[/EDIT]


----------



## Anubis273 (27. Aug 2012)

Danke Michael,

hab eine if Abfrage wie du es mir vorgeschlagen hattest drumherum programmiert und auf feste Länge geprüft, nun funktioniert es !

@papawinni: Is doch kein Ding ! Mit dem replace wäre super praktisch, jedoch baue ich wie du vollkommen richtig erkannt hast, alles wieder in einer anderen Reihenfolge zusammen 

Vielen Dank nochmal an alle !


----------



## pappawinni (27. Aug 2012)

Also lieber Anubis,
die If-Abfrage stand bereits in meinem ersten Posting. Du hast das evtl. nur nicht verstanden.
Insgesamt wird klar, dass du dich auf Anfänger-Niveau bewegst und insoweit hätte dein Beitrag wohl auch besser ins Anfänger-Forum gepasst.
Im Übrigen muss ich wohl demnächst den "Vielen Dank"-Button beantragen. Den haben scheinbar schon viele vergeblich gesucht. :lol:


----------



## Anubis273 (27. Aug 2012)

Hey pappawinni,

ja jetzt im Nachhinein hab ich verstanden was du mir mit deinem ersten Post sagen wolltest ! Das hatte ich auf Anhieb nicht ganz nachvollziehen können, Sorry. Das nächste " Dankeschön " gehört hoffentlich dir  

Danke nochmal


----------

