# CSV Datei in Array einlesen



## SKM (5. Jun 2009)

Hallo,
ich würde gerne eine CSV Datei in ein Array einlesen, mit dem ich dann im Programm weiterarbeite.
Allerdings fängt schon hier mein Problem an.
Es gibt viele Seiten wo Beispiele genannt werden, wie man das macht.
Aber könnt ihr mir das vielleicht etwas genauer erklären? Ich mache Java noch nicht soooo lange und es wäre mir wirklich eine große Hilfe, wenn Ihr mir die Schritte mal erklären würdet. 
Ich bin etwas überfordert und würde mich wirklich sehr über eure Hilfe freuen.

Mit freundlichen Grüßen
SKM


----------



## SlaterB (5. Jun 2009)

zeige doch den Code einer dieser Seiten, und erkläre, was du nicht verstehst


----------



## SKM (12. Jun 2009)

Mich würde erstmal interessieren wie ich anfange. 
Gibt es irgendwo Tutorials, wie ich so etwas mache?
Es soll folgende Tabelle (unvollständig) eingelesen werden und in einem Array gespeichert werden.
Was brauche ich dazu? Filreader...?

300	25	5
600	45	9
900	65	13
1200	85	17
1500	105	20
2000	133	20
2500	161	20
3000	189	20
3500	217	20

Ich bin ein Anfänger und wüsste gerne wo ich mich am besten reinlesen könnte.
Ich würde mich sehr über eure Hilfe freuen.


----------



## SlaterB (12. Jun 2009)

verwende entweder vorgefertigte Klassen,
denen du nur das Trennzeichen übergeben musst oder die sich selbst das selber suchen,

oder nimm einen FileReader, lies Strings ein und splitte die selber nach eigenen Regeln

zu beidem dürfte man was bei google finden, 
csv reader java - Google-Suche
csv parser java - Google-Suche
->


```
CSV Datei parsen [Archiv] - Unixboard.de[/url]
```


----------



## SKM (12. Jun 2009)

ok, vielleicht eine blöde Frage, aber warum soll ich bei Zahlenwerten mit Strings arbeiten?
Ich will die Zahlen in einer Rechnung als Integer weiterverwenden.
Lese ich diese dann trotzdem als Strings ein?


----------



## bygones (12. Jun 2009)

eingelesen wird im Grunde immer als String - du bist dann verantwortlich diese dann richtig weiterzuverarbeiten.


----------



## SlaterB (12. Jun 2009)

du liest erstmal die Datei, eine Datei ist immer Text, wenn nicht gar Binärdaten,
wenn du einzelne Zeilen als String hast, kannst du sie nach einem Trennzeichen splitten und dann gerne einzelne String-Stücke in Zahlen umwandeln


----------



## SKM (12. Jun 2009)

OK, danke.
Das hilft mir vom Verständnis her schon weiter.
Ich sollte vielleicht etwas mehr erklären, was ich damit vorhabe...

Ich möchte die Tabelle in einem Array speichern.
Später soll ein Benutzer einen Wert eingeben, welcher dann aus der ersten Spalte herausgesucht wird (muss übereinstimmen).
Dann sollen die nächsten zwei Spalten dieser Zeile in jeweils einer variablen gespeichert werden, mit der ich dann Rechnungen machen kann.
Habt ihr dazu noch tipps zum vorgehen?


----------



## SlaterB (12. Jun 2009)

am besten einen Schritt nach dem anderen,
und immer schön mit Testwerten arbeiten, nicht die Benutzereingabe als erstes bauen und dann jedesmal etwas eintippen müssen..


----------



## SKM (13. Jun 2009)

Ich habe bisher folgenden Code. Es wird bisher nur eine Tabelle ausgelesen.
Wie kann ich diesen Code nun so ändern, dass die Tabelle komplett in ein Array (oder Arraylist?) gelesen wird?


```
public class einlesen {
	
	public static void main(String args[]) throws Exception {
		
		//Instanzvariablen
		FileReader fr ;
		BufferedReader br;
		ArrayList al;
		
		fr = new FileReader("tabelle.csv");
		br = new BufferedReader(fr);
		al = new ArrayList();
		String s;
		while ((s = br.readLine()) != null) {
		System.out.println(s);
		}
		fr.close();
		}
		}public class einlesen {
	
	public static void main(String args[]) throws Exception {
		
		//Instanzvariablen
		FileReader fr ;
		BufferedReader br;
		ArrayList al;
		
		fr = new FileReader("tabelle.csv");
		br = new BufferedReader(fr);
		al = new ArrayList();
		String s;
		while ((s = br.readLine()) != null) {
		System.out.println(s);
		}
		fr.close();
		}
		}
```


----------



## SlaterB (14. Jun 2009)

statt
> System.out.println(s);
schreibst du
al.add(s);
schon sind die Zeilen in einer Liste drin


----------



## SKM (14. Jun 2009)

vielen Dank, dass ihr mir so helft und so viel Gedult habt ;-)

Wenn ich al.add(s); anstallt von System.out... reinschreibe kommt jedoch folgender Hinweis:

"Type safety: The method add(Object) belongs to the raw type ArrayList. References to 
 generic type ArrayList<E> should be parameterized"

Was hat das zu bedeuten? Es ist jedenfalls keine Fehlermeldung.


----------



## SlaterB (14. Jun 2009)

das bedeutet, dass du besser
ArrayList<String> al;
[..]		
	al = new ArrayList<String>();

gecodest hättest, um mitzuteilen, dass du nur Strings statt beliebige Objekte für die Liste planst,

Stichwort Generics, ein größeres Thema in Java


----------



## SKM (16. Jun 2009)

1. Verstaendnisfrage
Wieso wird eigentlich der String s mit dem filereader in Verbindung gebracht? Es ist ja schoen, dass es klappt, aber ich verstehe es noch nicht so ganz. Ich habe den code zum Teil kopiert und eingefuegt, wuerde ihn aber auch gerne verstehen.


```
public static void main(String args[]) throws Exception {
		
		//Instanzvariablen
		FileReader fr ;
		BufferedReader br;
		ArrayList al;
		
		fr = new FileReader("tabelle.csv");
		br = new BufferedReader(fr);
		al = new ArrayList();
		String s;
		while ((s = br.readLine()) != null) {
		al.add(s);
		}
		fr.close();
		}
		}
```

2. Nutze ich nun fuer meine Absichten besser den String Tokenizer oder die Split Methode?
Mein Problem ist ja wie folgt ...
Ich moechte ja die Tabelle mit den 3 Spalten in jeweils 3 Arrays spalten und in Variablen mit passenden Namen abspeichern.
Wie gehe ich da vor?

Ich bin gerade in der Uni und kann es leider nicht ausprobieren, aber es sollte doch wie folgt moeglich sein...


```
String[] splittArray = al.split("\\;");
```
Wenn ja, muesste ich die Spalten ja noch in Variablen speicher, aber wie ?


----------



## SlaterB (16. Jun 2009)

> Wieso wird eigentlich der String s mit dem filereader in Verbindung gebracht?

wieso man das macht?
gerade bei es so schön ist bzw. überhaupt eine der Möglichkeiten, voranzukommen

wie man das macht?
s = br.readLine()

2.
split ist moderner, in wenigen Situationen aber nicht ganz so flexibel,
auf die Elemente im splittArray kannst du mit Index 0-n zugreifen und irgendwohin schreiben


----------



## SKM (16. Jun 2009)

Verdammt, ich kriege es nicht hin.
Ich würde gerne den folgendem Beispielcode von tutorials.de in meinen code oben anwenden:


```
String tutorials = "www.tutorials.de";
 
String[] splittArray = tutorials.split("\\.");
 
Ergebnis:
 
splittArray[0] = "www";
splittArray[1] = "tutorials";
splittArray[2] = "de";
```
ich habe jetzt probiert erstmal lediglich 
String[] splittArray = al.split("\\.");
in meinen Code einzubinden.
Dabei sagt er mir jedoch schon bei "split" --->The method split(String) is undefined for the type ArrayList

Wie genau kann ich denn den Code einbinden?


----------



## SlaterB (16. Jun 2009)

z.B.
String[] splittArray = al.get(0).split("\\.");
wenn al einen String enthält,
evtl. musst du noch casten

das ganze wohl in einer Schleife für alle Strings in der Liste


----------



## SKM (19. Jun 2009)

hallo,
ich kriege es einfach nicht hin.
Könntest du vielleicht mal den Quelltext oben so verändern, dass es klappt? Soviel code dürfte doch nicht eingefügt werden müssen, oder?
Das wäre mir eine große Hilfe...


----------



## Leroy42 (19. Jun 2009)

@SlaterB

Warum steht zu deinem Post eigentlich "16.06.2009, 19:41"
obwohl es erst 18:52 ist?


----------



## SlaterB (19. Jun 2009)

weil der 19. eines Monats in der Regel nicht gleich dem 16. eines Monats ist


@SKM
String[] splittArray = al.get(0).split("\\.");


----------



## SKM (20. Jun 2009)

SlaterB hat gesagt.:


> @SKM
> String[] splittArray = al.get(0).split("\\.");


Ich habe auch hier das gleiche Problem wie oben:
Er sagt mir bei Split, --->The method split(String) is undefined for the type Object.

Was kann ich dagegen tun? Am casten kann es doch eigentlich nicht liegen, das müsste ich doch später auch noch machen können, oder?!


----------



## SlaterB (20. Jun 2009)

String eineVonVielenZeilen = (String) al.get(0);
String[] splittArray = eineVonVielenZeilen.split("\\.");


----------



## SKM (20. Jun 2009)

danke, so klappt es.
Allerdings gibt es schon ein nächstes Problem:
Wenn ich es mit Systemoutprintln teste wird die erste Zeile genausooft ausgegeben, wie die Tabelle Zeilen hat, wieso?
Zudem hat die Split Anweisung irgendwie keine Funktion. Ob ich sie nun drin behalte oder rausnehmen, es wird das gleiche ausgegeben.


----------



## SlaterB (20. Jun 2009)

da hast du wirklich ein Problem




fürs Protokoll:
ohne deinen Code kann ich den Fehler nicht erraten, 
außer wirklich offensichtliche Dinge, etwa dass du in der Schleife immer das erste Element aus der Liste nimmst statt das i-te


----------



## SKM (20. Jun 2009)

```
public class einlesen {

	public static void main(String args[]) throws Exception {

		//Instanzvariablen
		FileReader fr ;
		BufferedReader br;
		ArrayList  al;
		
		fr = new FileReader("tabelle.csv");
		br = new BufferedReader(fr);
		al = new ArrayList();
		String s;
		s = br.readLine();
		al.add(s);
		String eineVonVielenZeilen = (String) al.get(0);
		String[] splittArray = eineVonVielenZeilen.split("\\;"); 
		System.out.println(eineVonVielenZeilen);
		
		
		fr.close();
	}
}
[/Java]
Ok, mein Fehler,
ich habe jetzt die Schleife erstmal rausgenommen, die brauche ich doch vorerst nicht, oder?
Aber was hat eineVonVielenZeilen.split("\\;") nun für eine Funktion???
```


----------



## SlaterB (20. Jun 2009)

du hast es doch selber schon beschrieben


SKM hat gesagt.:


> ```
> String tutorials = "www.tutorials.de";
> 
> String[] splittArray = tutorials.split("\\.");
> ...


die Methode splittet den String anhand des Trennzeichens und erstellt ein Array mit den Einzelelementen,
was kann daran unverständlich sein?

der String selber wird dadurch nicht verändert

schau dir an, was im Array steht, falls du das benötigst:
System.out.println(Arrays.toString(array));
oder wieder eine for-Schleife


-----

man kann doch nicht jeden Programmierschritt einzeln erklären?


----------

