wie lese ich ein CSV File in meiner App

  • Antworten:6
  • OffenNicht stickyNicht beantwortet

06.08.2010 22:37:50 via Website

Hallo zusammen,

Ich weiss wie man in Java ein CSV normalerweise liest, aber in meiner App schaff ich das nicht. D.h. ich weiss nicht mit welcher Methode ich das File öffnen kann, wenn ich es zum Beispiel in den Assets-Folder stelle.

Ein Einzeiler mit der richtigen Methode und dem richtigen Pfadangabe eines Beispiels würde mir sehr helfen.

Grüsse
mcfly

07.08.2010 13:37:41 via Website

Hi,

leg die CSV-Datei mal (ohne die Dateiendung .csv) in den Ordner /res/raw/ und greif das wie folgt darauf zu:


InputStream in = activity.getResources().openRawResource(csv-dateiname);
BufferedInputStream bis = new BufferedInputStream(in);
DataInputStream dis = new DataInputStream(bis);

try {
while (dis.available() != 0) {

// Auslesen einer Zeile
String row = dis.readLine();

// Bei mir hat die CSV-Datei 6 Columns
String[] datensatz = new String [6];

// Mit der Klasse Scanner kannst Du den Delimiter festlegen und die einzelnen Zeilen auslesen
Scanner scan = new Scanner(row);
scan.useDelimiter(";");

int i = 0;
while(scan.hasNext()){
datensatz[i] = scan.next();
i++;
}
}
} catch (IOException e) {
e.printStackTrace();
}


Mh, irgendwie lässt sich mein Code nicht im Code-Block darstellen.

Hoffe ich konnte Dir weiterhelfen.

Viele Grüße

— geändert am 07.08.2010 13:42:15

07.08.2010 13:51:47 via Website

Leider stinkt der Code,


while (dis.available() != 0) {

Hier kann es passieren das sofort 0 geliefert wird, die Java Doc sagt dazu:

Returns the number of bytes that can be read (or skipped over) from this input stream without blocking by the next caller of a method for this input stream. The next caller might be the same thread or or another thread.

The available method for class InputStream always returns 0.

This method should be overridden by subclasses.

Besser ist mit InputStream#read zu arbeiten oder direkt die Methode #readLine, du machst aber beides was keinen Sinn ergibt!

Gruss von den Kanaren,
Mac

Windmate HD, See you @ IO 14 , Wundercar, Glass V3, LG G Watch

09.08.2010 12:34:40 via Website

Der Vollständigkeit halber:


InputStream in = activity.getResources().openRawResource(naehrwert);
BufferedInputStream bis = new BufferedInputStream(in);
DataInputStream dis = new DataInputStream(bis);

String row = null;

try {
while ((row = dis.readLine()) != null) {

// Bei mir hat die CSV-Datei 6 Columns
String[] datensatz = new String [6];

// Mit der Klasse Scanner kannst Du den Delimiter festlegen und die einzelnen Zeilen auslesen
Scanner scan = new Scanner(row);
scan.useDelimiter(";");

int i = 0;
while(scan.hasNext()){
datensatz[i] = scan.next();
i++;
}
}
} catch (IOException e) {
e.printStackTrace();
}


Besser so, MacSystems? :)

— geändert am 09.08.2010 12:35:51

11.12.2012 19:33:04 via Website

Hallo Community..

Vielen Dank erstmal im voraus...

Habe den Code so angewendet wie er hier steht. Ich habe eine CSV Datei ( Dateiname .CSV dann entfernt ) in meinen Android Projekt.
Wie kann ich erreichen, dass ich eine bestimmt Zeile auslesen kann ?
Er liest immer nur die letzte Zeile ( meiner CSV Datei aus dem RAW Verzeichnis, die 4 Zeilen hat ).
Meine CSV Datei hat immer 7 Spalten.
Die kann ich super mit den Datensätzen ausgeben ( leider immer nur die letzte Zeile in der Datei ).

.....
String datensatz0 = datensatz[0];
String datensatz1 = datensatz[1]; // und so weiter
test_ausgabe.setText( String.valueOf(datensatz0)+String.valueOf(datensatz1) ....);
.....


Ich würde aber gerne eine bestimmte Zeile aus meiner CSV Datei nutzen, und die Datensätze dann daraus ausgeben wollen.

Für mich klar ist, wenn es heißt : while ((Zeile = in.readLine()) != null) { ....
--> dass er solange macht bis die nächste Zeile leer ist, und dann das zuvor nimmt

Brauche ich noch eine 8. Spalte, die vielleicht ein Zeichen enthält wie : ENDL ? Damit readLine() erkennt, dass dann die Zeile zuende ist ?


LG , wäre dankbar um Hilfe...
Habe jetzt schon ewig gesucht und probiert.

— geändert am 11.12.2012 20:52:34