2009-11-08 8 views
13

J'essaye d'analyser un fichier .csv avec OpenCSV dans NetBeans 6.0.1. Mon fichier contient du caractère Unicode. Quand je l'écris en sortie, le personnage apparaît sous une autre forme, comme (HJ1'-E /;). Quand j'ouvre ce fichier dans le Bloc-notes, cela semble correct.Parse fichier CSV contenant un caractère Unicode en utilisant OpenCSV

Le code que je:

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

Répondre

31

Vous devez d'abord savoir ce que l'encodage de votre fichier est, par exemple UTF-8 ou UTF-16. Qu'est-ce qui génère ce fichier pour commencer? Après cela, c'est relativement simple - vous devez créer un FileInputStream enveloppé dans un InputStreamReader au lieu de simplement FileReader. (FileReader utilise toujours l'encodage par défaut pour le système.) Spécifiez l'encodage à utiliser lorsque vous créez le InputStreamReader, et si vous avez choisi le bon, tout devrait commencer à fonctionner.

Notez que vous n'avez pas besoin d'utiliser OpenCSV pour le vérifier - vous pouvez simplement lire le texte du fichier et l'imprimer. Je ne suis pas sûr que je ferais confiance à System.out pour pouvoir gérer des caractères non-ASCII - vous voudrez peut-être trouver une autre façon d'examiner les chaînes, telles que l'impression des valeurs individuelles des caractères comme entiers (de préférence en hexadécimal) et puis en les comparant avec le charts at unicode.org. D'autre part, vous pouvez essayer le bon encodage et de voir ce qui se passe pour commencer ...

EDIT: D'accord, donc si vous utilisez 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); 
} 

(je l'espère, vous avoir un try/finally bloc pour fermer le fichier dans votre code réel.)

Questions connexes