Analizar el archivo CSV que contiene un carácter Unicode usando OpenCSV
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);
}
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 FileInputStream
archivo envuelto en un archivo InputStreamReader
en lugar de solo un archivo FileReader
. ( FileReader
siempre usa la codificación predeterminada para el sistema). Especifique la codificación que usará cuando cree el archivo InputStreamReader
y, 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.out
de 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).