# CSV auslesen und Zeilen in Array speichern



## Guest (10. Okt 2006)

Hallo Leute,

ich habe 2 CSV Dateien, die die gleichen Zeilenanzahl besitzen. Die eine Datei ist eine Erweiterung der anderen. Das bedeutet das Zeile 1 von Datei 2 die Verlängerung von Zeile 1 der Datei 1 ist. Ich muß nun beide Dateien einlesen und die zusammengeführten Zeilen in ein Array speichern, damit ich sie später bearbeiten und dannach in eine Datenbank schreiben kann! Die Dateien haben auch leere Felder und sind durch ein @ getrennt. Hat mir jemand einen Lösungsansatz. Bin für jede Hilfe dankbar!


----------



## SlaterB (10. Okt 2006)

Dateien einlesen ist ein Problem für sich unabhängig vom aktuellen Anwendungsfall,
kannst du diese oder nicht?

da gibts keinen Lösungsansatz, das steht in jedem Lehrbuch,

--------

wenn die Dateien insgesamt als String vorliegen,
möchtest du die anscheinend auftrennen,

nach Zeilen trennt man bei Zeilenumbrücken, '\n' wahrscheinlich,
oder man liest du Dateien direkt zeilenweise ins Programm ein,

nach @ kann man dann auch trennen und die einzelnen Felder weiterbearbeiten,

zum Trennen benutzt man String.split oder StringTokenizer,
Fragen dazu?
--------
wenn du damit fertig bist kann man über weitere inhaltliche Dinge nachdenken, 
was immer du da zusammenführen willst, ist mir noch nicht klargeworden,
Beispielzeilen sind günstig


----------



## Guest (10. Okt 2006)

Hallo,

danke erstmal!
Mache das erst mal mit einer Datei.
Ich lese sie so aus:

```
private static void dateiInhaltLesen() {
		try {
            String csv;
            BufferedReader csv_file = new BufferedReader(new FileReader("test.txt"));
            while ((csv = csv_file.readLine()) != null)
```

Jetzt wird in der Schleife ja jede Zeile ausgelesen. Funktioniert das auch für Werte die nichts enthalten.
Würde ja erst mal jede Zeile in ein Array speichern und erst später verarbeiten. Wichtig wäre dabei daß er auch leere Spalten erkennt. Wie gehe ich jetzt am besten vor?


----------



## SlaterB (10. Okt 2006)

es werden ganze Zeilen gelesen, alles zwischen zwei Zeilenumbrüchen, 
also alles was z.B. in einem Standardtexteditor in einer Zeile dargestellt wird,
das kann auch ein leerer String sein, ja

---------

mit Auftrennung nach Spalten hat das noch nichts zu tun,
da kommt dan String.split(Trennzeichen) zum Zuge, dieses erkennt auch leere Felder,
während StringTokenizer gerne leere Felder ganz überspringt


----------



## Guest (10. Okt 2006)

hier ist mal vorab mein code:


```
private static void dateiInhaltLesen() {
		try {
            String csv;
            BufferedReader csv_file = new BufferedReader(new FileReader("PKWDAT.txt"));
            while ((csv = csv_file.readLine()) != null)
                 {
                 String[] werte = csv.split("@");
                 int len = werte.length;
                 for (int i=0; i<len;i++)
                       {
                        List list = new ArrayList();
                           list.add(werte);
                 }
            }
       }       
       catch (IOException e) {
          System.out.println("Fehler beim einlesen der Datei.");
       }
	}
```

1. ich bekomme an der Stelle: List list = new ArrayList(); folgende Fehlermeldung:ArrayList cannot be resolved to a type.
    Verstehe aber nicht ganz warum?
2. Jetzt wird ja jeder Wert in ein ArrayList geschrieben. Ist das richtig? Ist das bei großen Datenmengen nicht aufwendig?

Danke für jede Hilfe. Bin eben noch nicht so fit in Java!


----------



## AlArenal (10. Okt 2006)

1. fehlender Import?
2. kommt drauf an wie groß "groß" ist und was man damit machen will


----------



## silko (10. Okt 2006)

ich habe 60 000 Zeilen und ca. 20 Spalten! Das ist sehr viel...

FileReader("test.txt") bedeutet ja nur daß die "test.txt" zum einlesen genommen wird.
die Datei muß ja dann im root liegen. Wie gebe ich dem File Reader ein Pfad mit?


----------



## SlaterB (10. Okt 2006)

entweder dir/test.txt für ein relatives Unterverzeichnis,
auch ../irgendwas für höhere Verzeichnisse geht,
oder absolut: c:/irgendwas,

kann man doch ausprobieren?

--------

wenn du 60.000 Zeilen einzeln vorhalten willst, dann brauchst du eben 60.000 ArrayLists,
geht natürlich auch sparsamer, z.B. mit einer ArrayList/ Array mit 60.000*20 Felder und intelligenter Index-Berechnung,
aber bei weniger als 1 Mio. Objekte musst du dir da keine Sorgen machen bisher

------

bei deinem bisherigen Code werden die Listen erzeugt und danach nicht gespeichert sondern sofort wieder 'vergessen'

-------

zum Testen bietet es sich übrigens an, eine Datei mit EINER oder 10 Zeilen zu nehmen,
nicht 60.000..


----------



## silko (11. Okt 2006)

Hallo,

das ist mein bisheriger code:

```
private static void dateiInhaltLesen() {
		BufferedReader csv_file = null;
		
		try {
			String csv;
            csv_file = new BufferedReader(new FileReader("csv/PKWDAT.txt"));
            while ((csv = csv_file.readLine()) != null)
            {
            
            List daten = new ArrayList();
            int maxFelder = 0;
            String[] zeile = csv.split("@");
            if (zeile.length > maxFelder){
            maxFelder = zeile.length;
            }
            daten.add(zeile);
            }
                 
		} catch (IOException e) {
          System.out.println("Fehler beim einlesen der Datei.");
         
       }
```

Ich lese bis jetzt eine csv Datei zeilenweise ein. Ich möchte nun die Zeilen in ein ArrayList packen. Und die einzelnen Felder der csv Datei sollen als String[] in der ArrayList sein. Ich weiß nicht ob das wirklich Sinn macht und ob der Code überhaupt das erfüllt. Wie gesagt, ich habe zwei einzelne .csv Dateien (test.csv und test1.csv).  test1.csv ist eine Erweiterung von test.csv. Das bedeutet daß test1.csv zusatzfelder zu test.csv hat. Das gute ist daß die zeile 1 der test1.csv sich auf die zeile 1 der test.csv bezieht usw.


----------



## lhein (11. Okt 2006)

Also ich würde Dir folgendes vorschlagen...

1. Einlesen der ersten Datei und speichern der gesamten Zeile ungesplittet als String + @ am Ende in eine ArrayList
2. Einlesen der zweiten Datei, wobei du die eingelesene Zeile einfach zu der bestehenden Zeile im ArrayList addest
3. Mach deine Verarbeitungsroutine für das ArrayList-Objekt...von mir aus ungefähr so

```
for (int i_zeile=0; i_zeile<arrayListMitZeilen.size(); i_zeile++)
{
   String s_zeile = (String)arrayListMitZeilen.get(i_zeile);
   String s_tokens[] = s_zeile.split("@");
   for (int i_token=0; i_token < s_tokens.length; i_token++)
   {
      // tu etwas mit dem Token
   }
}
```

Gruß
lr


----------



## SlaterB (11. Okt 2006)

bevor sich das verbreitet:
ein Unterstrich hat in normalen Java-Variablen nix zu suchen


----------



## lhein (11. Okt 2006)

sagt wer?

ist bei uns gang und gebe so.

gruß
lr


----------



## Roar (11. Okt 2006)

LR hat gesagt.:
			
		

> String s_zeile und so weiter...


die _vergewaltigte_ ungarische notation ist eigentlich schon so sehr veraltet, dass nichtmal c oder c++ programmierer sie noch anwenden.

im übrigens ist das sowieso schmarrn, siehe: http://de.wikipedia.org/wiki/Ungarische_Notation


----------



## lhein (11. Okt 2006)

Hehe, schöner Link.
Aber da diese Notation bei uns schon sehr lange in Gebrauch ist, ist es Teil der Coding Conventions geworden und somit für mich bindend 

Aber um alle zu beruhigen:

silko, bitte lass die Prefixes vor den Variablen weg, das macht hier einige Leute kirre 

Gruß
lr


----------

