Analizar el archivo CSV que contiene un carácter Unicode usando OpenCSV

Resuelto meysam_pro asked hace 15 años • 1 respuestas

Estoy intentando analizar un archivo .csv con OpenCSV en NetBeans 6.0.1. Mi archivo contiene algún carácter Unicode. Cuando lo escribo en la salida, el carácter aparece en otra forma, como (HJ1'-E/;). Cuando abro este archivo en el Bloc de notas, se ve bien.

El código que utilicé:

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);
    }
meysam_pro avatar Nov 08 '09 14:11 meysam_pro
Aceptado

Primero necesita saber en qué codificación está su archivo, como UTF-8 o UTF-16. ¿Qué genera este archivo para empezar?

Después de eso, es relativamente sencillo: debe crear un FileInputStreamarchivo envuelto en un archivo InputStreamReaderen lugar de solo un archivo FileReader. ( FileReadersiempre usa la codificación predeterminada para el sistema). Especifique la codificación que usará cuando cree el archivo InputStreamReadery, si ha elegido la correcta, todo debería comenzar a funcionar.

Tenga en cuenta que no necesita utilizar OpenCSV para comprobar esto; puede leer el texto del archivo usted mismo e imprimirlo todo. Sin embargo , no estoy seguro System.outde poder confiar en poder manejar caracteres que no sean ASCII; es posible que desee encontrar una forma diferente de examinar cadenas, como imprimir los valores individuales de los caracteres como números enteros (preferiblemente en hexadecimal) y luego comparándolos con los gráficos en unicode.org . Por otro lado, podrías probar la codificación correcta y ver qué sucede al principio...

EDITAR: Bien, entonces si estás usando 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);
}

(Espero que tengas un bloque try/finally para cerrar el archivo en tu código real).

Jon Skeet avatar Nov 08 '2009 08:11 Jon Skeet