csv auslesen, mittels List

Diskutiere csv auslesen, mittels List im Java Basics - Anfänger-Themen Bereich.
I

Iago

Hallo,

ich versuche gerade eine csv-Datei auzulesen mittels einer List. So wie ich das hier mache, werden die Zeilen bis auf die Letzte
überschrieben. Gibt es eine andere Möglichkeit, sodass alle Werte ausgelesen werden? Vielen Dank

Java:
package fileprocessors;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class TestFileReader {

    public static void main(String[] args) throws Exception {
        
        
        String filePath = "table.csv";   
        List<String> values = null;
        
        List<String> lines = new ArrayList<String>();
        
        try(BufferedReader br = new BufferedReader(new FileReader(filePath))){           
            
            br.readLine();
            String line = null;
            
     while((line = br.readLine()) != null) {                   
                lines.add(line);               
            
        
        for(String ln : lines) {
            
            
            String [] header = ln.split(",");
            values = new ArrayList<String>();
            
            values = Arrays.asList(header);
        
        }
        
            }   
        
     for(String val : values) {
            
            System.out.println(val);
        }
        }
    }
}
 
H

httpdigest

Java:
import java.io.*;
import java.util.*;
public class TestFileReader {
  public static void main(String[] args) throws Exception {
    String filePath = "table.csv";
    List<List<String>> lines = new ArrayList<>();
    try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
      br.readLine();
      String line = null;
      while ((line = br.readLine()) != null) {
        lines.add(Arrays.asList(line.split(",")));
      }
    }
    for (List<String> line : lines) {
      System.out.println(line);
    }
  }
}
 
I

Iago

Hi, ja, die Sache ist, dass ich gerne die einzelnen Werte haben möchte, da ich Summe, Mittelwert usw. ausrechen möchte. Macht es Sinn die Werte in ein Array zu packen, bevor ich mit den Collections komm. (also erst am Schluss die Werte in einer ArrayList zu speichern)? Merci!
 
H

httpdigest

Ich verstehe deine Frage nicht ganz. Du hast doch mit dem Code alle Werte für alle Zeilen in der Liste und kannst diese Zeilen und Werte pro Zeile nach Belieben iterieren.
Macht es Sinn die Werte in ein Array zu packen, bevor ich mit den Collections komm
Häh?
 
mrBrown

mrBrown

Was durchaus Sinn macht, ist einen vernünftigen CSV-Parser zu verwenden, statt da selber mit Split zu arbeiten :)
 
I

Iago

Ich verstehe deine Frage nicht ganz. Du hast doch mit dem Code alle Werte für alle Zeilen in der Liste und kannst diese Zeilen und Werte pro Zeile nach Belieben iterieren.
Die Frage ist eben wie. Wenn ich den BufferedReader verwende habe ich ja erst einmal Zeilen und keine einzelnen Werte. Wenn ich die einzelnen Zeilen in einer ArrayList speichere kann ich z.B kein split() verwenden um die einzelnen Werte der Zeile zu trennen.
 
H

httpdigest

Also nochmal: Der Code, den ich dir geschrieben habe, liest bereits die einzelnen Werte jeder einzelnen Zeile in eine List<List<String>> ein...
Die List<List<String>> ist die Liste aller Zeilen. Und jedes Element dieser Liste (vom Typ List<String>) sind die einzelnen Werte innerhalb der jeweiligen Zeile.
 
Zuletzt bearbeitet:
mrBrown

mrBrown

Würde ich nicht uneingeschränkt sagen. Für eine simple CSV-Datei, die z. B. nur Zahlen enthält, werf ich keinen Parser an.
Sobald irgendein zweites Programm/eine zweite Person dran beteiligt ist, würd zumindest ich mich nie drauf verlassen, dass 'n Split noch funktioniert.
 
I

Iago

Also nochmal: Der Code, den ich dir geschrieben habe, liest bereits die einzelnen Werte jeder einzelnen Zeile in eine List<String<String>> ein...
Die List<String<String>> ist die Liste aller Zeilen. Und jedes Element dieser Liste (vom Typ List<String>) sind die einzelnen Werte innerhalb der jeweiligen Zeile.
Achso, d.h. ich müsste jetzt ganz easy auf sagen wir die Werte der ersten Spalte, also 1,7,13.. usw zugreifen können.
 
H

httpdigest

Ich habe zwar keine Ahnung, was du mit 1,7,13.. meinst, aber die jeweils erste Spalte jeder Zeile auszugeben, würde hiermit gehen (vorausgesetzt obiger Code mit List<List<String>> lines):
Java:
// Die erste Spalte jeder Zeile ausgeben:
for (List<String> line : lines) {
  System.out.println(line.get(0));
}
 
I

Iago

Ich habe zwar keine Ahnung, was du mit 1,7,13.. meinst, aber die jeweils erste Spalte jeder Zeile auszugeben, würde hiermit gehen (vorausgesetzt obiger Code mit List<List<String>> lines):
Java:
// Die erste Spalte jeder Zeile ausgeben:
for (List<String> line : lines) {
  System.out.println(line.get(0));
}
Ich versteh den Code mit"List<List<String>> lines = new ArrayList<>();" noch nicht ganz, versuche aber das zu verinnerlichen. Dank estmal!
 
H

httpdigest

Naja, eine Liste hat ja einfach nur einen Elementtyp - das was in der Liste gespeichert wird.
Wenn du zum Beispiel Strings in einer Liste speicherst, ist der Elementtyp = String, und somit der generische Typ der Liste = List<String>. Wenn du nun aber wiederum Listen in einer Liste speicherst, dann hast du ja List<List>. Und wenn diese inneren Listen eben ihrerseits Strings speichern, dann hat die Gesamtliste den Typ List<List<String>>, also "List of List of String".
 
I

Iago

Ok, dass heisst dann, dass split() hier die einzelen Werte trennt und nicht nur die Zeilen, richtig?

Code:
lines.add(Arrays.asList(line.split(",")));
 
mihe7

mihe7

Richtig. BufferedReader#readLine() liest eine Zeile (String) ein, während String#split(",") eine Zeichenkette an den Kommas aufteilt und die Teile in Form eines String-Arrays als Ergebnis liefert.

Bevor Du fragst: wenn die Zeichenketten Zahlen darstellen, mit denen Du rechnen willst, musst Du sie in Zahlen umwandeln (Double.parseDouble, Integer.parseInt usw. sind Deine Freunde).
 
I

Iago

Richtig. BufferedReader#readLine() liest eine Zeile (String) ein, während String#split(",") eine Zeichenkette an den Kommas aufteilt und die Teile in Form eines String-Arrays als Ergebnis liefert.
...wobei das Array dann mit Array.asList wiederum in die Liste gepackt wird.

Ich versuchs mal so. Ich habe doch diese innere List von List<List<String>> lines (die innere Liste!!), welcher Prozess befüllt diese Liste mit den einzelnen Werten.? Müsste da nicht eine zweite Schleifen (for oder while) her?

Oder kann man das so sagen, Array.asList packt alles in die Liste, auch das Array im Array, also in die Liste in der Liste?

Merci vielmals!
 
Zuletzt bearbeitet:
mihe7

mihe7

Die Frage hast Du doch schon selbst beantwortet: Arrays.asList - liefert das String-Array als Liste.

Beispiel:
Java:
List<List<String>> alleZeilen = new ArrayList<>();
String s = "1,2,3";  // eine eingelesene Zeile
String[] values = s.split(","); // liefert das Array {"1", "2", "3"}
List<String> valuesAsList = Arrays.asList(values); // liefert eine List mit 3 "Zeilen": "1", "2" und "3"
alleZeilen.add(valuesAsList); // fügt valuesAsList der Liste alleZeilen hinzu
Benötigst Du jetzt die Werte der ersten Zeile:
Java:
List<String> zeile = alleZeilen.get(0); // Werte der ersten Zeile
String ersteSpalteDerErstenZeile = zeile.get(0);
 
I

Iago

Ich verstehe deine Frage nicht ganz. Du hast doch mit dem Code alle Werte für alle Zeilen in der Liste und kannst diese Zeilen und Werte pro Zeile nach Belieben iterieren.

Häh?
Häh, ja genau, denn die Schwierigkeit besteht darin zu verstehen, wie Java das Array/ die Arrays in eine Liste umwandelt, der Rest ist easy
 
Thema: 

csv auslesen, mittels List

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben