# csv Dateien



## KlemensyXYZ (8. Nov 2011)

Hallo,

könnte mir jemand kurz zeigen wie man 
- eine csv datei einliest
- einen (oder mehrere) bestimmte(n) Wert(e) in einer Zeile oder Spalte ändert
- wie man das ganze wieder als csv datei speichert.

PS.: Habe das noch nie gemacht, brauche es aber Donnerstag für die Klassenarbeit, daher _bitte_ möglichst einfach erklären 

Danke


----------



## Gast2 (8. Nov 2011)

> - eine csv datei einliest


Datei zeilenweise lesen und am delimiter splitten.



> - einen (oder mehrere) bestimmte(n) Wert(e) in einer Zeile oder Spalte ändert


Joa, intern halt was ändern an den Daten.



> - wie man das ganze wieder als csv datei speichert.


Zeilenweise die Daten zurückschreiben und die einzelnen Felder mit dem delimiter trennen.

Wo hakts bei dir denn genau?


----------



## Asgar13 (8. Nov 2011)

KlemensyXYZ hat gesagt.:


> Hallo,
> 
> könnte mir jemand kurz zeigen wie man
> - eine csv datei einliest
> ...



???:L google

1. Datei einlesen
2. String splitten
3. Wert bestimmen
4. Austauschen
5. Datei schreiben

Habe ich aus einem anderen Thema eine Beispiel kopiert.(1+2)

```
BufferedReader reader = new BufferedReader(new FileReader("antworten.txt"));
    String zeile = reader.readLine();
    ArrayList<String> values = new ArrayList<String>();
    while (zeile != null)
    {
        values.add(zeile.split(";").toString());
    }
```


----------



## KlemensyXYZ (8. Nov 2011)

EikeB hat gesagt.:


> Joa, intern halt was ändern an den Daten.


bzw.


Asgar13 hat gesagt.:


> 3. Wert bestimmen
> 4. Austauschen
> 5. Datei schreiben


genau da 

ich kann mir das nicht vorstellen wie ich da jetzt genau den einen Wert zum ändern
- in der Datei finden
- und ihn dann ändern soll

hast du etwas quelltext?


----------



## Asgar13 (8. Nov 2011)

KlemensyXYZ hat gesagt.:


> bzw.
> 
> genau da
> 
> ...



Hast du als Input Zeile und Spalte, oder das Wort, welches ersetzt werden soll?


----------



## KlemensyXYZ (8. Nov 2011)

also die Aufgabe könnte so aussehen:
1.) Lese die csv Datei ein
2.) Ändere alle Namen die mit "a" beginnen in "x"
3.) usw.
4.) Speichere die Datei ab.

wie ich das mache bleibt mir überlassen

so wie ich das sehe habe ich als input die komplette Datei ???:L


----------



## Camill (8. Nov 2011)

Asgar13 hat gesagt.:


> Habe ich aus einem anderen Thema eine Beispiel kopiert.(1+2)
> 
> ```
> BufferedReader reader = new BufferedReader(new FileReader("antworten.txt"));
> ...



Wunderschöne Endlosschleife ;-)


----------



## nrg (8. Nov 2011)

vorallem wo ist der Sinn darin den String zu splitten und dann das Array wieder in einen String umzuwandeln?


----------



## KlemensyXYZ (8. Nov 2011)

Ist keine Endlosschleife.
Irgendwann ist line = null.

Und was hat das mit dem Problem zu tun?


----------



## Asgar13 (8. Nov 2011)

KlemensyXYZ hat gesagt.:


> also die Aufgabe könnte so aussehen:
> 1.) Lese die csv Datei ein
> 2.) Ändere alle Namen die mit "a" beginnen in "x"
> 3.) usw.
> ...



Speichere alle in einem Stringarray, dann wandele jeden String in einem charArray und vergleiche den ersten Buchstaben mit 'a', wenn das der Fall ist(in inneren von der if-Bedingung), dann gibst du dem Charakter den Buchstaben 'x'.

(Quellcode sollte dir jemand anderes machen, ich bin ab jetzt inaktiv).


----------



## nillehammer (8. Nov 2011)

> Ist keine Endlosschleife.
> Irgendwann ist line = null.
> Und was hat das mit dem Problem zu tun?


Doch, das kopierte Beispiel ist leider etwas unglücklich, weil es einen Fehler enthält. Im Beispiel wird die erste Zeile gelesen. Wenn diese != null ist, wird die while-Schleife endlos ausgeführt. Und das hat vielleicht nichts mit dem Problem zu tun. Aber der Hinweis von Camill ist doch nett, damit Du das nicht selbst herausfinden musst.

Abgesehen davon ist in dem Beispiel auch die Verarbeitung der Werte ziemlich Banane. Hier wird durch splitten ein String-Array erzeugt. Das wird aber garnicht gespeichert, sondern das Ergebnis des Aufrufs von toString() auf dem Array-Objekt. Dieses enthält die ziemlich nichts sagende Speicheradresse. Aber egal...

Das readline gehört auf jeden Fall in die while-Schleife hinein, nicht davor. Also etwa so:
[Java]
    BufferedReader reader = new BufferedReader(new FileReader("antworten.txt"));
    String zeile = null;
    ArrayList<String> values = new ArrayList<String>();
    while ((zeile = reader.readLine()) != null)
    {
        values.add(zeile.split(";").toString());
    }
[/Java]


----------



## Camill (8. Nov 2011)

KlemensyXYZ hat gesagt.:


> Ist keine Endlosschleife.
> Irgendwann ist line = null.
> 
> Und was hat das mit dem Problem zu tun?


Doch, wie "nillehammer" bereits auch bestätigt und Ausführlicher erklärt hat. Danke 

So dann poste ich auch nochmal etwas zum Thema. Ist nur eine Idee die mir Ad-hoc einfiel, musste mich jedoch selber erst ein wenig einlesen da ich mit mehrdimensionalen Arrays noch nie gearbeitet habe :bahnhof:

Hier eine Möglichkeit des Auslesens und speichern der *.csv in einem String-Array:

```
BufferedReader reader = new BufferedReader(new FileReader("File.csv"));
		
//TODO size of array is not dynamic
String[][] strings = new String[10][10];
int i = 0, j;
String line = null;
    
while((line = reader.readLine()) != null) {
	j = 0;
    String[] strArr = line.split(";");
    	
    for(int k = 0; k < strArr.length; k++) {
    	strings[i][j] = new String(strArr[k]);
    	j++;
    }
    i++;
}
```


----------



## KlemensyXYZ (8. Nov 2011)

Camill hat gesagt.:


> Ein kleines Makel habe ich dir markiert, wusste nicht wie ich ein mehrdimensionales Array mit beliebiger Größe initialisier *schäm*


das Problem mit den Arrys ist, das Ihre Größe nicht änderbar ist (bzw soweit ich weis nicht ein belibig großes Array erstellt werden kann) und ich die benötigte größe nicht vorher weis.

kann man irgendwie die zeilenlänge einer Datei bestimmen?
dann würde das mit den Arrays gehen


----------



## Camill (8. Nov 2011)

Dann muss man wohl alles in eine Arraylist legen, werde das mal gleich ändern.


----------



## Camill (8. Nov 2011)

So dürfte es nun aber gehen, wesentlich unkomplizierter.

Zum Auslesen der *.csv und Speichern in einer Arraylist:

```
BufferedReader reader = new BufferedReader(new FileReader("File.csv"));
ArrayList<String[]> strings = new ArrayList<String[]>();
String line = null;

while((line = reader.readLine()) != null) {
    strings.add(line.split(";"));
}
```


----------



## KlemensyXYZ (8. Nov 2011)

und wie kann ich jetzt mit der ArrayList weiterarbeiten?

wenn ich das ausgebe bekomme ich nur

```
[[Ljava.lang.String;@65690726]
[Ljava.lang.String;@65690726
[[Ljava.lang.String;@65690726, [Ljava.lang.String;@525483cd]
[Ljava.lang.String;@65690726
[Ljava.lang.String;@525483cd
```


----------



## Camill (8. Nov 2011)

Die String-Arrays liegen in Form eines Object in der Arraylist, deßhalb musst du natürlich erst Casten.

```
for(int i = 0; i < strings.size(); i++) {
	String[] arr = (String[]) strings.get(i);

	//get array of one line
	for(int j = 0; j < arr.length; j++)
		//TODO
}
```
In der zweiten for-Schleife kannst du dann auch direkt das handling zum ändern eines Wertes übernehmen.


----------



## KlemensyXYZ (8. Nov 2011)

Code zur Ausgabe:

```
for(int i = 0; i < strings.size(); i++) 
{
	String[] arr = (String[]) strings.get(i);
			 
	//get array of one line
	for(int j = 0; j < arr.length; j++)
	{
	//TODO
	System.out.println(arr[j]);
	}  
}
```
Ausgabe

```
[[Ljava.lang.String;@65690726]
Hallo
wie
geht
es
dir
[[Ljava.lang.String;@65690726, [Ljava.lang.String;@525483cd]
Hallo
wie
geht
es
dir
Mir
geht
es
sehr
gut
```
irgendwie kommt da zuviel:bahnhof:
So sollte die Ausgabe aussehen:

```
Hallo
wie
geht
es
dir
Mir
geht
es
sehr
gut
```


----------



## Camill (8. Nov 2011)

Zeile 1 und 7 stammen sicherlich noch von den Ausgaben die du in 3 Posts hier drüber gemacht hast oder?


----------



## KlemensyXYZ (8. Nov 2011)

nope
die kommen immer noch


----------



## Camill (8. Nov 2011)

In der for-Schleife kann ich keinen Fehler entdecken, poste mal den restlichen Code.


----------



## KlemensyXYZ (8. Nov 2011)

```
import java.io.*;
import java.util.ArrayList;

public class csv 
{
	public static void main(String[] args) throws IOException 
	{
		BufferedReader reader = new BufferedReader(new FileReader(new File("H:\\KA.csv")));
		String line;
		String[] temp;
		ArrayList<String[]> strings = new ArrayList<String[]>();
		while((line = reader.readLine()) != null)
		{
			strings.add(line.split(";"));
			System.out.println(strings);
			for(int i = 0; i < strings.size(); i++) 
			{
			    String[] arr = (String[]) strings.get(i);
			 
			    //get array of one line
			    for(int j = 0; j < arr.length; j++)
			    {
			    	 //TODO
			    	System.out.println(arr[j]);
			    }  
			}
		}
	}
}
```


----------



## Camill (8. Nov 2011)

Wie bereits erwähnt, in Zeile 15 machst du noch Ausgaben die dementsprechend Zeile 1 und 7 in der Ausgabe erzeugt haben.

```
[[Ljava.lang.String;@65690726]
Hallo
wie
geht
es
dir
[[Ljava.lang.String;@65690726, [Ljava.lang.String;@525483cd]
Hallo
wie
geht
es
dir
Mir
geht
es
sehr
gut
```


----------



## KlemensyXYZ (8. Nov 2011)

funzt


----------



## Camill (8. Nov 2011)

Jetzt habe ich den Fehler entdeckt, die for-Schleife(Zeile 16-26) muss außerhalb der while-Schleife stehen.


----------



## KlemensyXYZ (8. Nov 2011)

jetzt nur noch irgendwie werte ändern 

und wie geht das?


----------



## Camill (8. Nov 2011)

In der for-Schleife wo du die Ausgaben machst kommst du ja an jeden einzelnen String ran, wenn die Aufgabe wie von dir geschrieben "2.) Ändere alle Namen die mit "a" beginnen in "x"" lautet kannst du dort von jedem String das erste Zeichen mit "a" vergleichen und somit auch ersetzen.


----------



## KlemensyXYZ (9. Nov 2011)

ein problem hab ich noch:

wenn ich jetzt eine spalte eingelesen habe, wie kann ich denn nun da einen bestimmten eintrag ändern, z.B Zeile1, Spalte2; also
	
	
	
	





```
Name;Telefonnummer;Strasse
```
 in 
	
	
	
	





```
Name;Vorname;Strasse
```
ändern?

und wie bekomme ich das ganze dann an exakt der gleichen Stelle wieder in die Datei geschrieben?

 _Quelltexte bitte _


----------



## KlemensyXYZ (9. Nov 2011)

hat sich grade erledigt

quelltext:

```
package hilfe;

import java.io.*;
import java.util.ArrayList;

public class csv 
{
	public static String newline = System.getProperty("line.separator");				//Methode für Zeilenumbruch
	
	@SuppressWarnings("unused")
	public static void main(String[] args) throws IOException 
	{
		String file = "I:\\KA.csv";
		String file2 = "I:\\KA2.csv";
		BufferedReader reader = new BufferedReader(new FileReader(new File(file)));
		String line = null;
		int AnzahlZeilen = 0;
		int AnzahlSpalten = 0;
		int Dauer = 0;
		boolean testen = false;
		
		ArrayList<String[]> strings = new ArrayList<String[]>();						//Erstellen einer ArrayList
		while((line = reader.readLine()) != null)
		{
			if (testen == false)														//Zählen wie viele Einträge in einer Zeile sind
			{
				for (int i = 1; i <= line.length(); i++)
				{
					String test = String.valueOf(line.charAt(i - 1));
					if (test.equals(";"))
					{
						AnzahlZeilen ++;
					}
				}
				testen = true;
			}
			strings.add(line.split(";"));												//Eingelesene Daten der ArrayList hinzufügen
			AnzahlSpalten++;
		}
		
		FileWriter writer = new FileWriter(file2);
		for(int i = 0; i < strings.size(); i++) 
		{
		    String[] csvArray = (String[]) strings.get(i);								//Daten aus ArrayList in ein Array schreiben 
		    for(int j = 0; j < csvArray.length; j++)
		    {
		    	 //blubb																//irgendwas mit String machen

		    	Dauer ++;
		    	if (Dauer <= AnzahlZeilen)												//Daten zurück in csv datei schreiben
		    	{
		    		writer.write(csvArray[j] + ";");
		    	}
		    	if ( Dauer > AnzahlZeilen)
		    	{
		    		writer.write(csvArray[j]);
	            	writer.write(newline);
	            	Dauer = 0;
		    	}	
		    }    
		}		
		writer.close();																	//Writer schließen
	}
}
```


----------

