csv Dateien

K

KlemensyXYZ

Gast
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 :oops:

Danke
 
G

Gast2

Gast
- 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

Bekanntes Mitglied
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 :oops:

Danke

???: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)
Java:
    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());
    }
 
K

KlemensyXYZ

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

Camill

Bekanntes Mitglied
Habe ich aus einem anderen Thema eine Beispiel kopiert.(1+2)
Java:
    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());
    }

Wunderschöne Endlosschleife ;-)
 

nrg

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

KlemensyXYZ

Gast
Ist keine Endlosschleife.
Irgendwann ist line = null.

Und was hat das mit dem Problem zu tun?
 

Asgar13

Bekanntes Mitglied
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

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).
 
N

nillehammer

Gast
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]
 
Zuletzt bearbeitet von einem Moderator:

Camill

Bekanntes Mitglied
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:
Java:
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++;
}
 
Zuletzt bearbeitet:
K

KlemensyXYZ

Gast
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

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

Zum Auslesen der *.csv und Speichern in einer Arraylist:
Java:
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(";"));
}
 
K

KlemensyXYZ

Gast
und wie kann ich jetzt mit der ArrayList weiterarbeiten?

wenn ich das ausgebe bekomme ich nur
Code:
[[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

Bekanntes Mitglied
Die String-Arrays liegen in Form eines Object in der Arraylist, deßhalb musst du natürlich erst Casten.
Java:
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.
 
K

KlemensyXYZ

Gast
Code zur Ausgabe:
Java:
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
Code:
[[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:
Code:
Hallo
wie
geht
es
dir
Mir
geht
es
sehr
gut
 
K

KlemensyXYZ

Gast
Java:
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

Bekanntes Mitglied
Wie bereits erwähnt, in Zeile 15 machst du noch Ausgaben die dementsprechend Zeile 1 und 7 in der Ausgabe erzeugt haben.
Java:
[[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
 

Camill

Bekanntes Mitglied
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.
 
K

KlemensyXYZ

Gast
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
Code:
Name;Telefonnummer;Strasse
in
Code:
Name;Vorname;Strasse
ändern?

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

:oops: Quelltexte bitte :oops:
 
Zuletzt bearbeitet von einem Moderator:
K

KlemensyXYZ

Gast
hat sich grade erledigt

quelltext:
Java:
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
	}
}
 

Neue Themen


Oben