我正在编写一个Java应用程序以将数据从Oracle导出到CSV文件
不幸的是,数据的内容可能非常棘手。分隔符仍然是逗号,但连续的一些数据可能是这样的:
| ID | FN | LN | AGE | COMMENT | |----------------------------------------------------------------| | 123 | John | Smith | 39 | I said "Hey, I am 5'10"." | |----------------------------------------------------------------|
因此,这是该comment列上的字符串之一:
comment
我说:“我是5‘10”。
别开玩笑了,我需要在Java生成的CSV文件中的excel或开放式办公室中显示上述注释,而又不能妥协,并且当然不能弄乱其他常规的转义符情况(即,常规的双引号和元组中的常规逗号)。我知道正则表达式功能强大,但是在如此复杂的情况下如何实现目标呢?
有几个库。这是两个示例:
阿帕奇共享郎包括一类特殊的逃避或UNESCAPE字符串(CSV,EcmaScript的,HTML,Java和JSON,XML) org.apache.commons.lang3.StringEscapeUtils 。
org.apache.commons.lang3.StringEscapeUtils
转义 为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”“.”“”
__从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"."
如果使用 OpenCSV ,则无需担心转义或不转义,仅需写或读内容。
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();
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();