java regex excel oracle csv

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



"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