String, Split (",") wird wahrscheinlich nicht funktionieren.
Es teilt Felder mit eingebetteten Kommas ("Foo, Inc."), obwohl sie ein einzelnes Feld in der CSV-Zeile sind.
Was passiert, wenn der Firmenname ist:
Company, Inc.
oder noch schlimmer:
Joes "Gut, schnell und billig" Essen
Laut Wikipedia: (http://en.wikipedia.org/wiki/Comma-separated_values)
Felder mit eingebetteten Kommata müssen in doppelten Anführungszeichen eingeschlossen werden.
1997,Ford,E350,"Super, luxurious truck"
Felder mit eingebetteten doppelten Anführungszeichen müssen in doppelten Anführungszeichen eingeschlossen werden, und jede der eingebetteten doppelte Anführungszeichen muß durch ein Paar doppelter Anführungszeichen dargestellt werden.
1997,Ford,E350,"Super ""luxurious"" truck"
Schlimmer noch, zitierte Felder Zeilenumbrüche haben (Zeilenumbrüche; "\ n") eingebettet:
Felder mit eingebetteten Zeilenumbrüche müssen in doppelte Anführungszeichen eingeschlossen werden.
1997,Ford,E350,"Go get one now
they are going fast"
dies das Problem mit String zeigt, Split ("") Parsen Komma:
Die CSV-Zeile ist:
a, b, c, "Company, Inc.", d, e, "Joe's" "Gut, schnell und billig" "Food", f, 10/11/2010,1/1/2011, g, h, i
// Test String.split(",") against CSV with
// embedded commas and embedded double-quotes in
// quoted text strings:
//
// Company names are:
// Company, Inc.
// Joe's "Good, Fast, and Cheap" Food
//
// Which should be formatted in a CSV file as:
// "Company, Inc."
// "Joe's ""Good, Fast, and Cheap"" Food"
//
//
public class TestSplit {
public static void TestSplit(String s, String splitchar) {
String[] split_s = s.split(splitchar);
for (String seg : split_s) {
System.out.println(seg);
}
}
public static void main(String[] args) {
String csvLine = "a,b,c,\"Company, Inc.\", d,"
+ " e,\"Joe's \"\"Good, Fast,"
+ " and Cheap\"\" Food\", f,"
+ " 10/11/2010,1/1/2011, h, i";
System.out.println("CSV line is:\n" + csvLine + "\n\n");
TestSplit(csvLine, ",");
}
}
erzeugt die folgende:
D:\projects\TestSplit>javac TestSplit.java
D:\projects\TestSplit>java TestSplit
CSV line is:
a,b,c,"Company, Inc.", d, e,"Joe's ""Good, Fast, and Cheap"" Food", f, 10/11/2010,1/1/2011, g, h, i
a
b
c
"Company
Inc."
d
e
"Joe's ""Good
Fast
and Cheap"" Food"
f
10/11/2010
1/1/2011
g
h
i
D:\projects\TestSplit>
Wo die CSV-Zeile sollte als analysiert werden:
a
b
c
"Company, Inc."
d
e
"Joe's ""Good, Fast, and Cheap"" Food"
f
10/11/2010
1/1/2011
g
h
i
nicht so seltsam eine Situation, wie Sie vielleicht denken :) –
Bibliotheken wie [OpenCSV] (http://opencsv.sourceforge.net/) behandeln alle seltsamen Fälle für CSV-Dateien (neue Zeilen, Abgrenzung, etc). – Joshua
Obwohl es keine "seltsamen" Fälle gibt, wird die Verwendung einer Bibliothek (1) die Wahrscheinlichkeit von Fehlern beim Parsen verringern; (2) bieten mehr Funktionen; (3) eine ausdehnbare Lösung ergeben; und (4) das Parsen von zukünftigen CSV-Dateien (falls erforderlich) leicht zu integrieren. –