StringTokenizer

kimi

Grünschnabel
Hi. ich muss die Datei aus Editor einlesen, in der Tabelle Speichern und ausgeben.
das hab ich bis jetzt geschrieben,jedoch bekomme ich bei der Ausführung die Fehlermeldung: at java.util.StringTokenizer.nextToken(Unknown Source)
at java.util.StringTokenizer.nextElement(Unknown Source)
kann mir jemand bitte dabei helfen. danke im vorraus


Java:
public class CSVDatei {
	
	private java.util.ArrayList<MeineMannschaft> importListe = new java.util.ArrayList<MeineMannschaft>();
	
	private Tabelle tabelle;
	
	
	//Konstruktor
	public CSVDatei()
	{
		this.tabelle = new Tabelle();
	}
	
	public void liesMannschaftenEin(){
		
		String datei = liesDateiEin("C:\\Mannschaften.csv");
				//System.getProperty("user.dir") + "/Mannschaften.csv");
		java.util.StringTokenizer tokens = new java.util.StringTokenizer(datei, ",", false);
	
		while (tokens.hasMoreElements())	// durchläuft die Elemente innerhalb der Zeile
		{
			while (tokens.hasMoreTokens())	// durchläuft die Zeilen innerhalb der Datei
			{
				
				//importiert die Elemente in die ArrayList
				importListe.add(new MeineMannschaft(
						(new String((String)tokens.nextElement())),			//name 
						(new String((String)tokens.nextElement())),			//ort
						(new Integer((String) tokens.nextElement())),		//anz. spiele
						(new Integer((String) tokens.nextElement())),		//siege
						(new Integer((String) tokens.nextElement())),		//niederlagen
						(new Integer((String) tokens.nextElement())),		//remis
						(new Integer((String) tokens.nextElement())),		//koerbe
						(new Integer((String) tokens.nextElement())),		//gegenkoerbe
						(new Integer((String) tokens.nextElement()))));		//tabellenpunkte
			
			
						
			}
	
		}
		tabelle.setListeVonMeineMannschaften(importListe);

	}

	
	public void gibMannschaftenAufKonsoleAus(){
		
		for(MeineMannschaft element: importListe){
			java.lang.System.out.println("drucke...");
			java.lang.System.out.println(element);
		}
	}
	

	

	public String liesDateiEin(String datei)
	{
		java.io.File f = new java.io.File(datei);

		int val = 0;
		StringBuffer sb = new StringBuffer();
		java.io.FileReader input;
		try
		{
			input = new java.io.FileReader(f);
			while ((val = input.read()) != -1)
			{
				sb.append((char) val);
			}
			input.close();
		}
		catch (Exception e)
		{

		}

		return sb.toString();
	}
	
	public void einlesenDatei() throws java.io.IOException {
		java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream("C:\\Mannschaften.csv")));
		String line = "";
		while(true){
		line = reader.readLine();
		if(line == null){
		break;	
		}	


		java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(line, ",");

		while(tokenizer.hasMoreTokens()){
		String token = tokenizer.nextToken();
		
		}
		}
		
	}

	
}


// Main methode
public static void main(String[] args) {
		CSVDatei datei = new CSVDatei();
		datei.liesMannschaftenEin();
		datei.gibMannschaftenAufKonsoleAus();

}
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

das ist nicht die komplette Fehlermeldung.

Ich würde mal behaupten, dass der Fehler hier liegt. Da du einfach annimmst, dass noch soviele Tokens in dem StringTokenizer vorhanden sind und in Wirklichkeit nicht mehr so viele Tokens vorhanden sind.
Code:
(new String((String)tokens.nextElement())), //name
(new String((String)tokens.nextElement())), //ort
(new Integer((String) tokens.nextElement())), //anz. spiele
(new Integer((String) tokens.nextElement())), //siege
(new Integer((String) tokens.nextElement())), //niederlagen
(new Integer((String) tokens.nextElement())), //remis
(new Integer((String) tokens.nextElement())), //koerbe
(new Integer((String) tokens.nextElement())), //gegenkoerbe
(new Integer((String) tokens.nextElement())))); //tabellenpunkte

Gruß

Sascha
 
hi. danke für deine antwort aber ich weiß immernoch nicht was ich tun soll.
wenn ich das so schreibe kommt weiterhin diese fehlermeldung und ich weiß nicht ob der die einzelne Elemente in Arraylist importiert.
System.out.println( tokens.nextToken() );
String tmp = tokens.nextToken();
System.out.println((tmp == null || tmp.length() == 0) ? "LEER" : tmp);

fehlermeldung:Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(Unknown Source)
at CSVDatei.liesMannschaftenEin(CSVDatei.java:42)
at StartApp.main(StartApp.java:9)
 
Hallo,

bei der Verwendung von StringTokenizer sollte man vor einem Zugriff auf nextElement mit hasMoreElements() prüfen ob noch ein Element verfügbar ist.

Java:
        StringTokenizer s  = new StringTokenizer("a b c");
        while(s.hasMoreElements()){
            System.out.println(s.nextElement());
        }

Viel besser als die alte Klasse StringTokenizer ist es die split(...) Methode der Klasse String zu verwenden:

Java:
        for(String s : "a;b;c".split(";")){
            System.out.println(s);
        }

Gruß Tom
 
Die Methoden
Code:
hasMoreElements()
und
Code:
hasMoreTokens
machen genau das gleiche. Genau wie die dazu gehörigen next-Methoden.

Wie gesagt, das Problem ist, dass du auf Elemente zugreifen möchtest, obwohl du schon am Ende des Tokenizers angekommen bist.

Ich sehe, dass du die Daten aus einer CSV-Datei ausliest, dann schau dir mal das an
http://www.csvreader.com/java_csv_samples.php
http://sourceforge.net/projects/javacsv/

Das sind zwei Libraries zum auslesen von CSV-Dateien mit Java.

Gruß

Sascha
 
Kann es sein, dass du in deinen Datenzeilen Leerfelder hast? Wenn zwei Separatoren aufeinanderfolgen, hast du plötzlich ein Token weniger, das zurückgeliefert werden kann. Dies könntest du z.B. dadurch vermeiden, dass du im Konstruktur true angibst, um überprüfen zu können, ob nextElement() einen Feldtrenner zurückliefert (dann hast du ein leeres Datenfeld) oder nicht (dann hast du ein verwertbares Token).
 
so sieht mein csv-datei im editor aus.
er liest die ganze daten ein und zeigt sie auch an aber am ende zeigt er die NoSuchElementException. aber wenn ich die System.out.println kommentiere kommt kein Exception mehr.

// System.out.println( tokens.nextToken() );
String tmp = tokens.nextToken();
System.out.println((tmp == null || tmp.length() == 0) ? "LEER" : tmp);
}

danke für deine hilfe
Code:
SV Halle,Halle,0,0,0,0,0,0,0,,BC pharamserc Marburg,Marburg,0,0,0,0,0,0,0,,TV 1872 Saarlouis,Saarlouis,0,0,0,0,0,0,0,,Eisvögel USC Freiburg,Freiburg,0,0,0,0,0,0,0,,New Basket 92 Oberhausen,Oberhausen,0,0,0,0,0,0,0,,ChemCats Chemnitz,Chemnitz,0,0,0,0,0,0,0,,BBV Leipzig,Leipzig,0,0,0,0,0,0,0,,Trinos Göttingen,Göttingen,0,0,0,0,0,0,0,,Herner TC,Herne,0,0,0,0,0,0,0,,BC Wildcats Wolfenbüttel,Wolfenbüttel,0,0,0,0,0,0,0,,
 
Zuletzt bearbeitet:
Hier hast du beispielsweise ein leeres Feld.
Code:
0,,BBV Leipzig,Leipzig
Zwischen der 0 und BBV
Am besten löst du es mit einer solchen Library, die ich dir oben gezeigt habe. Die sollten sowas berücksichtigen.

Gruß

Sascha
 
hi sascha. ich habe die daten so geändert wie du gesagt hattest und es gibt keine fehlermeldung mehr . ich danke dir für deine hilfe.
 
Zuletzt bearbeitet:
Zurück