2009-11-08 11 views
13

Sto cercando di analizzare un file .csv con OpenCSV in NetBeans 6.0.1. Il mio file contiene un carattere Unicode. Quando scrivo in output il carattere appare in un'altra forma, come (HJ1'-E /;). Quando quando apro questo file nel blocco note, sembra ok.File CSV di approfondimento contenente un carattere Unicode che utilizza OpenCSV

Il codice che ho usato:

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); 
    } 

risposta

31

Prima di tutto bisogna sapere che cosa codifica del file è in, come UTF-8 o UTF-16. Cosa sta generando questo file per cominciare?

Dopodiché, è relativamente semplice: è necessario creare uno FileInputStream in uno InputStreamReader anziché solo uno FileReader. (FileReader utilizza sempre la codifica predefinita per il sistema.) Specifica la codifica da utilizzare quando crei il InputStreamReader e, se hai scelto quello giusto, tutto dovrebbe iniziare a funzionare.

Nota che non è necessario utilizzare OpenCSV per controllare questo: è sufficiente leggere il testo del file e stampare tutto. Non sono sicuro che mi piacerebbe che lo System.out fosse in grado di gestire caratteri non ASCII - potresti voler trovare un modo diverso di esaminare le stringhe, ad esempio stampare i singoli valori dei caratteri come numeri interi (preferibilmente in hex) e quindi confrontandoli con lo charts at unicode.org. D'altra parte, si potrebbe provare la codifica a destra e vedere cosa succede per cominciare ...

EDIT: Okay, quindi se si sta utilizzando 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); 
} 

(io vi auguro prova/finalmente blocca per chiudere il file nel tuo codice reale.)