# Frage zu Javacsv/Csvreader: Zeilenanzahl



## klofisch (7. Aug 2012)

Hallo,

hat vielleicht schon jemand mit Javacsv was gemacht? Ich möchte gern die Anzahl der Zeilen eines CSV-Sheets augeben lassen.


Danke
Peter


----------



## parabool (7. Aug 2012)

laut Api getHeaderCount() , vorher  readHeaders() aufrufen.

CsvReader (JavaCSV API)

Edit: ok, Anzahl der Zeilen war gemeint, nicht der Spalten. 
Geht wohl nicht anders als  die csv Datei durchlaufen und  die Zeilen zählen.


----------



## parabool (7. Aug 2012)

hmm, ist mir gerade eingefallen: Du kannst aus der Größe der Datei und der durchschnittlichen
Länge einer Zeile die ungefähre Anzahl an Zeilen errechnen.

Hat bei mir gut geklappt (Fortschrittsanzeige beim Laden einer sehr grossen csv.Datei)


----------



## Gast2 (7. Aug 2012)

@parabool
Wie kommst du an die durchschnittliche Länge einer Zeile? Wenn du die schätzt kommt du nicht auf die exakte Anzahl der Zeilen, wenn du die ausrechnen willst bist du zwangsläufig schon alle Zeilen durchgegangen 

@TO:
Wenn die Datei nicht allzu groß ist würd ich die Datensätze inkrementell lesen und nen Zähler hochlaufen lassen.


----------



## parabool (7. Aug 2012)

Meine natürlich den "geschätzten Durschnitt" (den tatsächlichen auszurechnen wäre in der Tat absurd ) . 
Wenn sich das das Format nicht ändert hat man den ev. schon. Oder die ersten 100 Zeilen einlesen
und den Durchschnitt bilden, vorausgesetzt die Länge der Zeilen ist innerhalb der Datei ungefähr gleich verteilt. 
Die tatsächl. Anzahl wird da nicht rauskommen - klar. 

Habe es bei der Fortschrittsanzeige auch etwas anders gemacht: 
- Max. der Progressbar auf Grösse der Datei gesetzt (ev. mit Faktor)
- Value der Progressbar bei jeden Schritt um Grösse der aktuell gelesen Zeile erhöhen


----------



## klofisch (7. Aug 2012)

danke für die Antworten. Bin jetzt am Probieren mit jCSV von Eike.

bekomme ich die Fehlermeldung "The method newDefaultReader(Reader) is undefined for the type CSVReader"
wenn ich das Bsp. von der Webseite benutze.


```
Reader reader = new FileReader("data.csv");

CSVReader<String[]> csvPersonReader = CSVReaderBuilder.newDefaultReader(reader);
List<String[]> persons = csvPersonReader.readAll();
```


----------



## Gast2 (7. Aug 2012)

Auf der Startseite stand tatsächlich noch ein leicht altes Codebeispiel, ist mittlerweile korrigiert.

Der Code den du hier in deinem Post gepostet hast sollte aber funktionieren. Die Anzahl der Einträge (wenn du die Einträge später nichtmehr brauchst!) würde ich dann so auslesen:

```
CSVReader<String[]> csvPersonReader = CSVReaderBuilder.newDefaultReader(reader);

int counter = 0;
for (String[] row : csvPersonReader) {
	counter++;
}
System.out.printf("Einträge: %s", counter);
```


----------



## klofisch (7. Aug 2012)

Danke für die Info, der Fehler ist weg.

zwischenzeitlich versuche ich die Ergebnisse in ein zweidimensionales Array zu konvertieren. Sicher etwas umständlich, aber als neuling....

Ich bekomme dabei allerdings folgende Fehlermeldung nachdem ersten Datensatz


```
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
	at CsvTest01.main(CsvTest01.java:34)
```



```
String[] sResult;
		String[][] saReturn = { { "", "", "", "", "", "" } };
		try {
			Reader reader = new FileReader("./data/test1.csv");
			CSVReader<String[]> csvParser = CSVReaderBuilder
					.newDefaultReader(reader);
			List<String[]> laEntries = csvParser.readAll();
			System.out.println("List length: " + laEntries.size());

			for (int iRow = 0; iRow < laEntries.size(); iRow++) {
				sResult = laEntries.get(iRow);
				System.out.println("sResult " + sResult.length);
				for (int iCol = 0; iCol < sResult.length; iCol++) {
					System.out.println("iRow " + iRow);
					System.out.println("iCol " + iCol);
					System.out.println(sResult[iCol].toString());
					saReturn[iRow][iCol] = sResult[iCol].toString(); //Fehler wird hier produziert
				}
				
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
```

ich benutze diese Demodaten:


```
1;Dirk;Fleischhacker;23;m
2;Paul;Panzer;18;m
3;Christina;Kaltwasser;19;f
4;Angelika;Sauer;19;f
5;Susanne;Bloomberg;20;f
6;Maik;Rosenberg;22;m
7;Tom;Baumgartner;23;m
8;Paula;Schulz;17;f
```

Woran liegts?


----------



## Gast2 (7. Aug 2012)

Wofür genau brauchst du denn nen 2D Array? Tuts nicht auch die List<String[]> ?

Zu deinem Fehler:
Das saReturn Array ist zu klein, du legst das mit ner Größe von 1 an. Richtiger wäre sowas:

```
saReturn = new String[laEntries.size()][5];
```
Aber wie gesagt, wenns keinen wirklich guten Grund gibt das in nen 2D Array zu wandeln, dann benutz die Liste.

Und wenns doch nen 2D Array werden soll, dann mach die Umwandlung so:

```
String[][] result= list.toArray(new String[laEntries.size()][5]);
```


----------



## vanny (7. Aug 2012)

Schreib dir doch gleich einen Datentyp, der einen Datensatz als Objekt vorhält.
Diese Instanzen legste dann einfach in einer Liste oder Map ab.
Auch wenn du Neuling bist ist das kein Grund sich da durchzuwurschteln ;P 

Könnte etwa so aussehen:

```
public class CSVEintrag {
	
	private int id, age;
	private String firstName, lastName, gender;
	
	
	public CSVEintrag(int id, String firstName, String lastName, int age, String gender){
		setId(id);
		setFirstName(firstName);
		setLastName(lastName);
		setAge(age);
		setGender(gender);
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getFirstName() {
		return firstName;
	}
	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}
	public String getLastName() {
		return lastName;
	}
	public void setLastName(String lastName) {
		this.lastName = lastName;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}

}
```


----------



## klofisch (7. Aug 2012)

@Eike: Beim Ausprobieren konnte ich keinen Unterschied zwischen deinen Vorschlägen feststellen.

Ich brauche das um es in einem JTable darzustellen. Ich brauch dieses String-Array für das defaultdatamodel für ein JTable,

@Vanny
Merk ich mir für später

Danke erstmal


----------



## klofisch (13. Aug 2012)

Ich habe mich jetzt für opencsv entschieden. Nach ein bisschen rumprobieren und stricken geht schon mal bisschen was. Aber es gibt auch wieder neue Fragen.
Hier habe ich ein kleines problem mit Mein Problem ist noch das Trennzeichen. Gibt es eine Möglichkeit, dieses automatisch zu erkennen? Komma-getrennte Datensätze werden richtig erkannt, aber nicht mit Semikolon-getrennte.


----------



## parabool (13. Aug 2012)

Defaultseparator ist ja auch ',' 
mit Konstruktur 
	
	
	
	





```
CSVReader(Reader reader, char separator)
```
kannst das Trennzeichen festlegen.


----------

