2009-11-08 9 views
13

Ich versuche, eine CSV-Datei mit OpenCSV in NetBeans 6.0.1 zu analysieren. Meine Datei enthält einige Unicode-Zeichen. Wenn ich es in Ausgabe schreibe, erscheint das Zeichen in anderer Form, wie (HJ1'-E /;). Wenn ich diese Datei in Editor öffne, sieht es OK aus.Parse CSV-Datei mit einem Unicode-Zeichen mit OpenCSV

Der Code, den ich verwendet:

CSVReader reader=new CSVReader(new FileReader("d:\\a.csv"),',','\'',1); 
    String[] line; 
    while((line=reader.readNext())!=null){ 
     StringBuilder stb=new StringBuilder(400); 
     for(int i=0;i<line.length;i++){ 
      stb.append(line[i]); 
      stb.append(";"); 
     } 
     System.out.println(stb); 
    } 

Antwort

31

Zuerst müssen Sie wissen, was in der Datei kodiert ist, wie UTF-8 oder UTF-16. Was erzeugt diese Datei am Anfang?

Danach ist es relativ einfach - Sie müssen ein FileInputStream in einem InputStreamReader statt nur FileReader verpackt erstellen. (FileReader verwendet immer die Standardcodierung für das System.) Geben Sie die Codierung an, die beim Erstellen der InputStreamReader verwendet werden soll, und wenn Sie die richtige ausgewählt haben, sollte alles funktionieren.

Beachten Sie, dass Sie OpenCSV nicht verwenden müssen, um dies zu überprüfen - Sie könnten einfach den Text der Datei selbst lesen und alles ausdrucken. Ich bin mir nicht sicher, dass ich System.out vertrauen könnte, um mit Nicht-ASCII-Zeichen umgehen zu können - Sie möchten vielleicht eine andere Art der Zeichenfolgenprüfung finden, wie das Ausdrucken der einzelnen Werte von Zeichen als Ganzzahlen (vorzugsweise in hex) und dann vergleicht man sie mit der charts at unicode.org. Auf der anderen Seite, können Sie die richtige Codierung versuchen und sehen, was mit ...

EDIT starten passiert: Okay, also, wenn Sie mit UTF-8:

CSVReader reader=new CSVReader(
    new InputStreamReader(new FileInputStream("d:\\a.csv"), "UTF-8"), 
    ',', '\'', 1); 
String[] line; 
while ((line = reader.readNext()) != null) { 
    StringBuilder stb = new StringBuilder(400); 
    for (int i = 0; i < line.length; i++) { 
     stb.append(line[i]); 
     stb.append(";"); 
    } 
    System.out.println(stb); 
} 

(Ich hoffe, Sie habe einen try/finally Block, um die Datei in deinem echten Code zu schließen.)