# bis zum bestimmten Zeichen lesen.



## celloman (25. Mai 2009)

Hallo,

Ich habe eine Datei diese lese ich Zeilenweise in ein String ein.

In jede Zeile sind mehrer Kommas(,) vorhanden.

Beispiel: Birne, Banane, Kivi, Kirsche, Erdbeere, Orange, Apfel, Birne,

ich möchte den Inhalt bis zum 5'ten Komma lesen und in ein String schreiben.
Also die Rot markierten.


----------



## hammet (25. Mai 2009)

```
String str = "Birne, Banane, Kivi, Kirsche, Erdbeere, Orange, Apfel, Birne";

String[] arr = str.split(",");

for(int i = 0; i < 5; i++) {

System.out.println(arr[o]);

}
```


----------



## Billie (25. Mai 2009)

Hellas!

Es gibt übrigens auch eine Version von split mit einem Limit-Parameter:

String.split(String regex, int limit)


Hier ein anderer Ansatz:


```
public class SplitTest {

    public static void main(String[] args) {
        String s = "Birne, Banane, Kivi, Kirsche, Erdbeere, Orange, Apfel, Birne";
        int endIndex = -1;
        int limit = 0;
        
        while (s.indexOf(',', endIndex + 1) >= 0 && limit < 5) {
            endIndex = s.indexOf(',', endIndex + 1);
            limit++;
        }
        System.out.println(s.substring(0, endIndex));
    }
}
```


----------



## celloman (25. Mai 2009)

Es klappt bei mir irgendwie nicht.

Ich bekomme eine Fehlermeldung.

ich glaube weil ich mein text aus einer Datei auslese und in String schreibe.

Hier mein KODE


```
try{
    	 BufferedReader b = new BufferedReader (new FileReader("c:/java/alt.csv"));
       
    	 while( (zeile = b.readLine()) != null ) { // liest zeilenweise aus Datei
    	 
    		 text +=zeile;
    		 
    		 
             int endIndex = -1;
             int limit = 0;
       
             while (text.indexOf(',', endIndex + 1) >= 0 && limit < 5) {
             endIndex = text.indexOf(',', endIndex + 1);
             limit++;
             }
             System.out.println(zeile.substring(0, endIndex));
       }
    	 
      }
	      catch (IOException e) {
	        System.out.println("Fehler: "+e.toString());
	      }
```


----------



## Billie (25. Mai 2009)

Also, Du willst immer die ersten Fünf haben und der Variablen text zuweisen?

Dann musst Du in der while-Schleife die Variable text durch die Variable zeile ersetzen und die Anweisung


```
text +=zeile
```

hinter die while-Schleife verschieben. Ansonsten poste auch einfach mal die komplette Exception.

Beste Grüße,
Billie


----------



## celloman (25. Mai 2009)

Das ist der CODE

lese dashier aus einer Datei: "Birne, Banane, Kivi, Kirsche, Erdbeere, Orange, Apfel, Birne";




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


	  public class test {
 
    public static void main(String[] args) {
    	 
    	int endIndex = -1;
        int limit = 0;
    	String zeile="";
    	String text="";
    	
    	try{
    	 BufferedReader b = new BufferedReader (new FileReader("c:/java/alt.csv"));
       
    	 while( (zeile = b.readLine()) != null ) { // liest zeilenweise aus Datei
    	 
    		 text +=zeile;
  
             while (text.indexOf(',', endIndex + 1) >= 0 && limit < 5) {
             endIndex = text.indexOf(',', endIndex + 1);
             limit++;
             }
             System.out.println(text.substring(0, endIndex));
       }
    	 
      }
	      catch (IOException e) {
	        System.out.println("Fehler: "+e.toString());
	      }
   }
}
```

Das ist die Fehlermeldung



```
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
	at java.lang.String.substring(Unknown Source)
	at test.main(test.java:27)
```


----------



## Billie (25. Mai 2009)

Also die Exception tritt auf, weil endIndex den Wert -1. Das könnte zB der Fall sein, wenn kein Beistrich in der Variable text vorhanden ist. Lass Dir den Wert von text bzw. zeile vor der while-Schleife mal ausgeben.

Wenn Du keinen Fehler entdeckst, poste auch einmal die Beispiel-Datei.


----------



## celloman (25. Mai 2009)

Hier eien Datei,

Möchte alles bis zum fünften Komme(,) in ein String schreiben.


----------



## deepthroat (25. Mai 2009)

Hi.

Warum verwendest du denn keine Bibliothek um deine CSV Datei zu lesen? (http://opencsv.sourceforge.net/) Das würde die ganze Sache ziemlich vereinfachen.

Ansonsten solltest du immer irgendwelche Eingaben prüfen. Es kann ja mal sein, das eine Zeile nicht korrekt in der Datei steht. Dann ist es ganz schlecht wenn dein Code davon ausgeht, das mind. ein Komma drin ist.

```
int count = 0;
int start = 0, end;

while (count < 5 && (end = text.indexOf(',', start)) != -1) {
  start = end + 1;
  ++count;
}
if (count == 5) { // 5 Kommas gefunden
  System.out.println(text.substring(0, end));
} else {
  System.err.println("Fehler: Zeile inkorrekt formatiert: " + text);
}
```
Gruß


----------



## Billie (25. Mai 2009)

Also mit folgendem Code und deiner Datei bekomme ich keine Fehler:


```
public class SplitTest {

    public static void main(String[] args) {
        BufferedReader br = null;
        
        try {
            br = new BufferedReader(new FileReader("testdatei.txt"));
            String line = null;
            StringBuilder text = new StringBuilder();
            while((line = br.readLine()) != null) {
                int endIndex = -1;
                int limit = 0;
                
                while (line.indexOf(',', endIndex + 1) >= 0 && limit < 5) {
                    endIndex = line.indexOf(',', endIndex + 1);
                    limit++;
                }
                System.out.println(line.substring(0, endIndex));
                text.append(line.substring(0, endIndex));
            }
            System.out.println("text=" + text);
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            if(br != null) {
                try {
                    br.close();
                } catch(IOException e) {
                }
            }
        }
    }
}
```

hier jeweils die einzelnen Zeilen:


```
"4G8_800_415____0210_A01_0001_L","Widerstandspunktschweissen","2314,10","-850
"4G8_800_415____0210_A01_0001_R","Widerstandspunktschweissen","2314,10","850
"4G8_800_415____0210_A01_0002_L","Widerstandspunktschweissen","2294,20","-852
"4G8_800_415____0210_A01_0002_R","Widerstandspunktschweissen","2294,20","852
"4G8_800_415____0210_A01_0003_L","Widerstandspunktschweissen","2276,11","-853
"4G8_800_415____0210_A01_0003_R","Widerstandspunktschweissen","2276,11","853
```

und alle Zeilen in einer Wurst:

```
"4G8_800_415____0210_A01_0001_L","Widerstandspunktschweissen","2314,10","-850"4G8_800_415____0210_A01_0001_R","Widerstandspunktschweissen","2314,10","850"4G8_800_415____0210_A01_0002_L","Widerstandspunktschweissen","2294,20","-852"4G8_800_415____0210_A01_0002_R","Widerstandspunktschweissen","2294,20","852"4G8_800_415____0210_A01_0003_L","Widerstandspunktschweissen","2276,11","-853"4G8_800_415____0210_A01_0003_R","Widerstandspunktschweissen","2276,11","853
```

Aber, der ganze Algorithmus arbeitet mit Beistrich und Du hast Beträge in deiner Datei... ich glaube das ist nicht in Deinem Sinne. Verwende lieber das Semikolon ( ; ) um die "Spalten" abzugrenzen und ändere im Code die indexOf-Anweisungen entsprechend.


----------



## celloman (25. Mai 2009)

Habe dein Code reingespielt und ich bekomme immernoch Fehlermeldungen.


```
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
	at java.lang.String.substring(Unknown Source)
	at test.main(test.java:31)
```

Ich habe mir die CSV lib runtergeladen und wo muss ich sie reinspielen.


----------



## deepthroat (25. Mai 2009)

celloman hat gesagt.:


> Habe dein Code reingespielt und ich bekomme immernoch Fehlermeldungen.


Sicherlich nicht mit der Beispieldatei, oder?! Und von welchem Code sprichst du?


			
				celloman hat gesagt.:
			
		

> Ich habe mir die CSV lib runtergeladen und wo muss ich sie reinspielen.


Was benutzt du denn? Eclipse? Dann mußt du das entsprechende Jar welches in der Datei drin war als zusätzliche Bibliothek für das Eclipse-Projekt eintragen.

Gruß


----------



## celloman (25. Mai 2009)

Hallo,

Ich habe den Code von Billi verwendet.

und bekomme immernoch


----------



## deepthroat (25. Mai 2009)

celloman hat gesagt.:


> Hallo,
> 
> Ich habe den Code von Billi verwendet.


Dazu hab ich ja bereits was gesagt, warum das evtl. eine schlechte Idee ist.


celloman hat gesagt.:


> und bekomme immernoch


... ja, was denn? 

Gruß


----------



## Billie (25. Mai 2009)

Lass dir mal text bzw. zeile vor der while-Schleife ausgeben. Mit deiner geposteten Beispieldatei und dem Programmcode von mir läuft es grundsätzlich - also irgendetwas muss bei dir anders sein.

Lass dir ein paar Ausgaben machen, baue Überprüfungen - wie deepthroad angemerkt hat, gibt es schnell Probleme wenn die Datei mal nicht "den Erwartungen entspricht".

Und behandle die Ausnahmen zB:


```
try {
                    text.append(line.substring(0, endIndex));
                } catch (StringIndexOutOfBoundsException e) {
                    System.err.println("Problem mit Zeile '" + line + "', endIndex=" + endIndex);
                }
```

Und das Rätsel wird sich bald lösen


----------

