# CSV-Tabelle



## CEric (29. Feb 2012)

Hallo, ich soll ein kleines Programm zum Einlesen, Manipulieren und Schreiben von CSV Dateien implementieren, stehe da aber schon zu Beginn vor einigen Problemen, da ich noch nie mit so etwas gearbeitet habe!

```
public class CsvTable {
	//Initialisiert eine leere Tabelle und setzt als Trennzeichen das Komma. 
	public CsvTable(){
		char seperator = ',';
		
		String [][] csvtabelle;
		
	}
```
In dieser ersten Methode sollen wir wie beschrieben eine leere Tabelle erzeugen.
Mein Problem ist folgendes, die Tabelle sollte ein Array oder eine ArrayList sein, was ist damit gemeint, oder wie wird das Trennzeichen denn im array gesetzt, des weiteren ist ein array ja eigentlich statisch, wenn ich aber unterschiedlich lange Dateien habe muss ich ja z.B. die Spaltenzahl variieren können???

Danke


----------



## M_Schaffrath (29. Feb 2012)

Hast du den Code so bekommen oder selbst geschrieben?

Normalerweise würde ich davon ausgehen, dass der Separator nicht in das Array hineingeschrieben wird, sondern es einmal eine Datenstruktur gibt, die die Inhalte der Tabelle darstellt (z.B. ein Array oder eine ArrayList) und dazu dann eine Variable, unter der das Separatorzeichen abgelegt ist.

Wenn man dann die Daten in die Datei schreibt, wird der entsprechende Separator zwischen die einzelnen Einträge gesetzt.


----------



## KrokoDiehl (29. Feb 2012)

> Mein Problem ist folgendes, die Tabelle sollte ein Array oder eine ArrayList sein, was ist damit gemeint, oder wie wird das Trennzeichen denn im array gesetzt, des weiteren ist ein array ja eigentlich statisch, wenn ich aber unterschiedlich lange Dateien habe muss ich ja z.B. die Spaltenzahl variieren können???



Dafür ist eine ArrayList -bzw. allgemein die Collections von Java- geeigneter weil ihre Größe dynamisch ist. Eine Liste ist aber 1-dimensional, eine Tabelle wie du sie möchtest 2-dim.. Also wäre in diesem Fall eine 
	
	
	
	





```
List< List<String> >
```
 notwendig.
Man kann zwar auch mit Arrays "dynamisch" arbeiten, das macht man auch wieder nichts anderes als die ArrayList


----------



## CEric (29. Feb 2012)

Den Kommentar den du siehst, das ist die Aufgabenstellung zur ersten Methode!
Die weiteren Methoden sind:

```
public class CsvTable {
	//Initialisiert eine leere Tabelle und setzt als Trennzeichen das Komma. 
	public CsvTable(){
		char seperator = ',';
		
		String [][] csvtabelle;
		
	}

	/*Initialisiert eine leere Tabelle und setzt das gegebene Trennzeichen. 
	*Es sind nur die Trennzeichen Komma, Semikolon und Doppelpunkt erlaubt. 
	*Wird ein anderes Trennzeichen uebergeben, so ist eine IllegalArgumentException zu werfen. 
	*/
	public CsvTable(Character separator){
		char seperator = ';';
		if(seperator != ',' || seperator != ';' || seperator != ':'){
			throw new IllegalArgumentException("Trennzeichen ist kein Komma, Smikolon oder Doppelpunkt!");
		}
		else;
	}
	
	/*
	 * Speichert den Wert in value in die gegebenen Zeile und Spalte. Zeilen und Spalten werden ab 0 gezaehlt!
	 * Da die Tabelle beliebig groß werden kann, muessen Sie darauf achten die Groeße entsprechend anzupassen. 
	 * Wird ein Wert uebergeben, der das Trennzeichen enthaelt, so soll eine MalformedValueException geworfen werden.
	 * Ebenso sind negative Werte für Zeilen- und Spaltenangaben nicht zugelassen.
	 * In diesem Fall soll eine IllegalArgumentException geworfen werden. 
	 */
	public void setValue(int row, int column, String value){
		
	}
	
	/*
	 * Liefert den in der Zeile row und Spalte column gespeicherten Wert zurueck. 
	 * Bei negativen Eingaben soll eine IllegalArgumentException geworfen werden.
	 * Zeilen und Spalten werden ab 0 gezaehlt! Existiert an dieser Stelle kein Wert, so wir der leere String "" zurueckgegeben. 
	 */
	public String getValue(int row, int column){
		
	}
	
	
	//liefert das Trennzeichen
	public Character getSeparator(){
		
	}
	
	/*
	 * Liefert die Anzahl der benutzten Spalten. Spalten in denen der leere String "" steht gelten nicht als benutzt. 
	 * Ermitteln Sie hier unter allen Zeilen diejenige mit der groeßten benutzten Spalte.
	 */
	public int getColumns(){
		
	}
	
	/*
	 * Liefert die Anzahl der benutzten Zeilen. 
	 * Eine Zeile gilt als genutzt, wenn Sie mindestens einen vom leeren String verschiedenen Wert in einer Spalte besitzt.
	 */
	public int getRows(){
		
	}
	
	//Liefert den aktuellen Stand der Tabelle als String zurueck.
	public String toString(){
		
	}	
	
	
}//Ende Klasse CsvTable
```


----------



## M_Schaffrath (29. Feb 2012)

Warum werden da Variablen im Konstruktor deklariert? Die siehst du doch nie mehr wieder. Solltest du die Daten und den Separator nicht vielmehr als Felder der Klasse deklarieren und sie im Konstruktor initialisieren?


----------



## CEric (29. Feb 2012)

public CsvTable()
Hier liegt ja grundsätzlich mal mein erstes Problem, wie ich oben beschrieben habe, die Tabelle soll ein array oder eine arraylist sein.
Aber wie mache ich das, da ein array normalerweise ja statisch ist!


----------



## truesoul (29. Feb 2012)

Ausserdem ist der Code im zweiten Konstruktor auch nicht korrekt. 
Eine IllegalArgumentException würde in dem fall nie auftretten  
Und Instanzvariablen sind auch nicht vorhanden, aber das solltet ihr wohl implementieren.


> Aber wie mache ich das, da ein array normalerweise ja statisch ist!


Naja entweder verwendest du eine ArrayList oder erweiterst eine Array. 
Z.b neues Array erzeugen mit neuer Größe, Werte vom alten Array übernehmen und neue Werte hinzufügen.


----------



## M_Schaffrath (29. Feb 2012)

CEric hat gesagt.:


> public CsvTable()
> Hier liegt ja grundsätzlich mal mein erstes Problem, wie ich oben beschrieben habe, die Tabelle soll ein array oder eine arraylist sein.
> Aber wie mache ich das, da ein array normalerweise ja statisch ist!



Dann nimm, wie schon geschrieben eine ArrayList, die ist nicht statisch.


```
ArrayList<String> enememu = new ArrayList<>();
```

Aber wenn ich den Code im Konstruktor sehe, habe ich nicht den Eindruck, dass du wirklich weißt, was du da tust. Weißt du, wie Attribute aka Klassenvariablen funktionieren? Weißt du, was ein Konstruktor macht und warum deine Implementierung davon fragwürdig ist?

Außerdem solltest du dir vorher klar machen, was du tun willst, bevor du einfach lostippst und dich um Kopf und Kragen codest.


----------



## CEric (29. Feb 2012)

Ja, ich verstehe eben nicht genau wie das ganze mit nem array funktionieren soll, die größe des arrays müsste ich dann später glaube ich in der setValue verändern!


----------



## M_Schaffrath (29. Feb 2012)

Dann mach es mit einer ArrayList statt mit einem Array. Vergiss das Array, das brauchst du nicht.


----------



## CEric (29. Feb 2012)

```
public CsvTable(){
		
		ArrayList<String> tabelle = new ArrayList<>();
		
		}
```
Ok und was meint das ganze jetzt mit trennzeichen setzten usw?
Hm, du meintest ich soll mich nicht um Kopf und Kragen programmieren, aber so alt bin ich noch nicht was Java angeht, die Aufgabe an sich ist wahrscheinlich gar nicht mal schwer!


----------



## truesoul (29. Feb 2012)

CEric hat gesagt.:


> Ja, ich verstehe eben nicht genau wie das ganze mit nem array funktionieren soll, die größe des arrays müsste ich dann später glaube ich in der setValue verändern!



Naja ein Beispiel wäre z.B sowas: 

```
static String array [] = {"Eins"};
public static void main ( String[] args ) {
        setValue("Zwei");
}
	
	
static void setValue(String value){
	String array2 [] = new String[array.length+1];
	for(int i = 0; i< array.length;i++){
		array2[i] = array[i];
	}
	array2[array.length] = value;
	array = array2;
}
```

P.S static erstmal ignorieren. 

Oder man schaut sich mal die Klasse Arrays an.


----------



## CEric (29. Feb 2012)

Hm, danke schon mal, sollte mir erst mal weiterhelfen!


----------



## M_Schaffrath (29. Feb 2012)

Eine CSV-Datei stellt eine Tabelle dar. Dabei sind die einzelnen Spalten durch ein bestimmtes Zeichen und die einzelnen Reihen durch Zeilenumbrüche getrennt. Dieses "bestimmte" Zeichen kann z.B. ein Semikolon oder ein Komma sein. Allerdings muss es für die Datei einheitlich sein und darf natürlich nicht in den Datensätzen vorkommen. Programme wie Excel können solche Formate lesen und darstellen. Excel-Tabellen können auch im CSV-Format gespeichert werden (CSV steht übrigens für Comma Separated Values, also "durch Kommas getrennte Werte").

Ich gehe einmal davon aus, dass der Sinn der Aufgabenstellung ist, die Werte in einer geeigneten Datenstruktur abzuspeichern und sich dazu zu merken, welches Zeichen das Trennzeichen ist. Auf diese Weise kann man später damit CSV-Dateien schreiben und lesen.

Ich denke nicht, dass das Trennzeichen von anfang an in die Tabelle hineingeschrieben werden soll.

Du solltest dir also zuerst eine geeignete Datenstruktur bauen, die die Tabelleneinträge aufnehmen kann und das Trennzeichen irgendwo festlegen.


----------



## ARadauer (29. Feb 2012)

CEric hat gesagt.:


> Ja, ich verstehe eben nicht genau wie das ganze mit nem array funktionieren soll, die größe des arrays müsste ich dann später glaube ich in der setValue verändern!


ja so würde es funktionieren bzw intern arbeitet eine Liste so. Wenn du eine Wert setzt der ausserhalb deines Arrays ist dann musst du ein neues der entsprechenden größe machen und alle werte umkopieren....

Heißt jetzt dein array oder array list, dass du beides machen musst oder dass du dir es aussuche kannst?


----------



## CEric (29. Feb 2012)

Besser wäre wohl array wurde zu uns gesagt!


----------



## CEric (29. Feb 2012)

Hab das ganze erst mal so geschrieben:

```
public class CsvTable {
	
	//neue leere Tabelle
	String [][] tabelle = null;
	
	//Initialisiert eine leere Tabelle und setzt als Trennzeichen das Komma. 
	public CsvTable(){
		char trennzeichen = ',';
		tabelle = new String [0][0];
		
		}
	

	/*Initialisiert eine leere Tabelle und setzt das gegebene Trennzeichen. 
	*Es sind nur die Trennzeichen Komma, Semikolon und Doppelpunkt erlaubt. 
	*Wird ein anderes Trennzeichen uebergeben, so ist eine IllegalArgumentException zu werfen. 
	*/
	public CsvTable(Character separator){

                  if(separator != ',' || separator != ';' || separator != ':'){
			throw new IllegalArgumentException("Trennzeichen ist kein Komma, Smikolo
                        oder Doppelpunkt!");
		}
		else;
	}

public void setValue(int row, int column, String value){
	    for(int x = 0; x < tabelle.length; x++){
	        for(int y = 0; y < tabelle.length; y++){
	        	if(tabelle[x][y] != null){
	        		tabelle = new String[x+1][y+1];
	        	}
	        	else;
	        	
	        }
	    }

	}
```

Meine setValue soll dan wohl i-wei dazu da sein um die Tabelle gegebenenfalls zu erweitern!


----------



## CEric (29. Feb 2012)

Ich versteh das immer noch nicht genau , was in der Aufgabenstellung damit gemeint ist mit trennzeichen setzten!


----------



## ARadauer (29. Feb 2012)

CEric hat gesagt.:


> Besser wäre wohl array wurde zu uns gesagt!



Hier haben sicher schon 3 Leute gesagt du sollst eine Liste nehmen... :autsch:


----------



## ARadauer (29. Feb 2012)

```
if(tabelle[x][y] != null){
                    tabelle = new String[x+1][y+1];
                }
                else;
```
das ist ganz falsch... kommentier das mal, bzw schreib dazu was du meinst das hier passiert...


----------



## CEric (1. Mrz 2012)

Also wenn ich eine ArrayList nehme, muss ich ja eine Liste von der Liste machen, um in Tabellenform zu kommen.

```
ArrayList<ArrayList<String>> tabelle = new ArrayList();
```
Wenn ich den Wert value in die Tabelle speichern will, sieht das dann so aus?

```
public void setValue(int row, int column, String value) {

		//ich sehe mir die Zeile an, wenn diese nicht vorhanden ist erzeuge ich eine neue!?
		ArrayList<String> rowData = tabelle.get(row);
		if (rowData == null)
			rowData = new ArrayList();

		//Wert in das Feld setzen
		rowData.set(column, value);

		//Zeile zurück in die Tabelle schreiben
		tabelle.set(row, rowData);

	}
```

Habe ich das so einigermaßen richtig verstanden und gemacht???
MfG


----------



## CEric (1. Mrz 2012)

Also wenn ich das ganze dann mit einer ArrayList mach sieht das so aus oder?!

```
ArrayList<ArrayList<String>> tabelle= new ArrayList<ArrayList<String>>();
```

Und wenn ich dann den Wert value einfüge so:

```
public void setValue(int row, int column, String value) {
                  //wenn Zeile noch nicht vorhanden eine anlegen
		ArrayList<String> rowData = tabelle.get(row);
		if (rowData == null)
			rowData = new ArrayList();

		//Wert in das Feld setzen
		rowData.set(column, value);

		//Zeile zurück in die Tabelle schreiben
		tabelle.set(row, rowData);

	}
```

Und wie bekomme ich denn die Zeilen und Spaltenzahl der Liste als int-Wert?


----------

