bis zum bestimmten Zeichen lesen.

celloman

Erfahrenes Mitglied
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.
 
Java:
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]);

}
 
Hellas!

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

String.split(String regex, int limit)


Hier ein anderer Ansatz:

Java:
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));
    }
}
 
Zuletzt bearbeitet von einem Moderator:
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

Code:
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());
	      }
 
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

Code:
text +=zeile

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

Beste Grüße,
Billie
 
Das ist der CODE

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



Code:
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


Code:
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)
 
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.
 
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.
Java:
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ß
 
Zuletzt bearbeitet:
Also mit folgendem Code und deiner Datei bekomme ich keine Fehler:

Java:
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:

Code:
"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:
Code:
"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.
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück