Si hallas algún fallo con tu código o proyecto, recuerda probar siempre en un entorno de testing antes aplicar el código al proyecto final.
Solución:
Hay varias bibliotecas. Aquí hay dos ejemplos:
❐ Idioma Apache Commons
Apache Commons Lang incluye una clase especial para escapar o recuperar cadenas (CSV, EcmaScript, HTML, Java, Json, XML): org.apache.commons.lang3.StringEscapeUtils
.
-
Escapar 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 aquí.
❐ OpenCSV
Si utiliza OpenCSVno tendrás que preocuparte por escapar o no escapar, solo por 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();
-
Archivo de lectura:
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 aquí.
Excel tiene que ser capaz de manejar exactamente la misma situación.
Ponga esas cosas en Excel, guárdelas como CSV y examine el archivo con un editor de texto. Entonces sabrá las reglas que aplica Excel a estas situaciones.
Haga que Java produzca la misma salida.
Los formatos que utiliza Excel están publicados, por cierto…
**** Edición 1: **** Esto es lo que hace Excel
**** Edición 2: **** Tenga en cuenta que php fputcsv
hace exactamente lo mismo que excel si usa ” como el recinto.
[email protected]
Richard
"This is what I think"
se transforma en esto:
Email,Fname,Quoted
[email protected],Richard,"""This is what I think"""
Gracias a Tony y Paul por la rápida retroalimentación, es muy útil. De hecho, descubrí 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);
en resumen, si hay un carácter especial como una coma o una comilla doble dentro del string dentro de la celda, luego escape primero de las comillas dobles ("""
) agregando comillas dobles adicionales (como """"
), luego ponga todo entre comillas dobles (como """+theWholeThing+"""
)
Aquí tienes las reseñas y valoraciones
Te invitamos a añadir valor a nuestra información tributando tu experiencia en los informes.