excel to csv java
¿Cómo escapar de coma y comillas dobles al mismo tiempo para el archivo CSV? (7)
Excel tiene que ser capaz de manejar la misma situación exacta.
Ponga esas cosas en Excel, guárdelas como CSV y examine el archivo con un editor de texto. Entonces sabrá las reglas que Excel aplica a estas situaciones.
Haga que Java produzca el mismo resultado.
Los formatos utilizados por Excel se publican, por cierto ...
**** Editar 1: **** Esto es lo que Excel hace
**** Editar 2: **** Tenga en cuenta que fputcsv
''s fputcsv
hace exactamente lo mismo que excel si usa "como el gabinete".
[email protected]
Richard
"This is what I think"
se transforma en esto:
Email,Fname,Quoted
[email protected],Richard,"""This is what I think"""
Estoy escribiendo una aplicación Java para exportar datos de Oracle a un archivo csv
Lamentablemente, el contenido de los datos puede ser bastante complicado. La coma sigue siendo el delimitador, pero algunos datos en una fila podrían ser así:
ID FN LN AGE COMENTARIO
123, John, Smith, 39, dije "Oye, tengo 5''10".
así que esta es una de las cadenas en la columna de comment
:
Dije "Hola, tengo 5''10".
No es broma, necesito mostrar el comentario anterior sin compromiso en excel u open office desde un archivo CSV generado por Java, y por supuesto no puedo estropear otra situación de escape regular (es decir, comillas dobles regulares y coma regular dentro de una tupla). Sé que la expresión regular es poderosa, pero ¿cómo podemos lograr el objetivo en una situación tan complicada?
Gracias a Tony y Paul por los comentarios rápidos, es muy útil. De hecho, descubro una solución a través de POJO. Aquí está:
if (cell_value.indexOf("/"") != -1 || cell_value.indexOf(",") != -1) {
cell_value = cell_value.replaceAll("/"", "/"/"");
row.append("/"");
row.append(cell_value);
row.append("/"");
} else {
row.append(cell_value);
}
simplemente diciendo si hay un carácter especial como coma o comillas dobles dentro de la cadena al costado de la celda, luego primero escapa de la comilla doble ( "/""
) agregando una comilla doble adicional (como "/"/""
), luego pon el todo en una comilla doble (como "/""+theWholeThing+"/""
)
Hay varias bibliotecas. Aquí hay dos ejemplos:
❐ Apache Commons Lang
Apache Commons Lang incluye una clase especial para escapar o eliminar cadenas (CSV, EcmaScript, HTML, Java, Json, XML): org.apache.commons.lang3.StringEscapeUtils
.
Escape a CSV
String escaped = StringEscapeUtils .escapeCsv("I said /"Hey, I am 5''10/"./""); // I said "Hey, I am 5''10"." System.out.println(escaped); // "I said ""Hey, I am 5''10""."""
Unescape de CSV
String unescaped = StringEscapeUtils .unescapeCsv("/"I said /"/"Hey, I am 5''10/"/"./"/"/""); // "I said ""Hey, I am 5''10"".""" System.out.println(unescaped); // I said "Hey, I am 5''10"."
* Puedes descargarlo desde here .
❐ OpenCSV
Si usa OpenCSV , no tendrá que preocuparse por escape o unescape, solo para escribir o leer el contenido.
Archivo de escritura:
FileOutputStream fos = new FileOutputStream("awesomefile.csv"); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); CSVWriter writer = new CSVWriter(osw); ... String[] row = { "123", "John", "Smith", "39", "I said /"Hey, I am 5''10/"./"" }; writer.writeNext(row); ... writer.close(); osw.close(); os.close();
Leyendo archivo:
FileInputStream fis = new FileInputStream("awesomefile.csv"); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); CSVReader reader = new CSVReader(isr); for (String[] row; (row = reader.readNext()) != null;) { System.out.println(Arrays.toString(row)); } reader.close(); isr.close(); fis.close();
* Puedes descargarlo desde here .
Solo estoy usando fputcsv($fp, $res,'','','' '');
funcionar y obtener la csv correcta
También puede ver cómo Python escribe archivos csv
compatibles con Excel.
Creo que el valor predeterminado para Excel es doblar para caracteres de comillas literales, es decir, las comillas literales "
se escriben como ""
.
"cell one","cell "" two","cell "" ,three"
Guárdelo en el archivo csv y vea los resultados, por lo que se utiliza una comilla doble para escapar
Nota IMPORTANTE
"cell one","cell "" two", "cell "" ,three"
le dará un resultado diferente porque hay un espacio después de la coma, y eso será tratado como "
String stringWithQuates = "/""+ "your,comma,separated,string" + "/"";
esto retendrá la coma en el archivo CSV