如何在CSV文件中同时转义逗号和双引号?
我正在写一个Java应用程序将数据从Oracle导出到csv文件
不幸的是,数据的内容可能相当棘手。 依然逗号是删除,但连续的一些数据可能是这样的:
ID FN LN 年龄段 评论
123,约翰,史密斯,39,我说:“嘿,我是5'10”。
所以这是comment
栏中的一个string:
我说:“嗨,我是5'10”。
没有开玩笑,我需要从Excel生成的CSV文件,而不是在Excel或公开的办公室妥协的意见,当然不能搞乱其他常规逃跑的情况(即正常的双引号和元组内的常规逗号)。 我知道正则expression式是强大的,但是如何在这样复杂的情况下实现目标呢?
有几个图书馆。 这里有两个例子:
❐Apache Commons Lang
Apache Commons Lang包含一个特殊的类来转义或unescapestring(CSV,EcmaScript,HTML,Java,Json,XML): 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的Unescape
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
如果您使用OpenCSV ,则不必担心转义或unescape,只能用于写入或读取内容。
-
写文件:
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();
* 你可以从 这里 下载 。
Excel必须能够处理完全相同的情况。
把这些东西放入Excel,保存为CSV,并用文本编辑器检查文件。 然后你就会知道Excel应用于这些情况的规则。
使Java产生相同的输出。
Excel使用的格式发布,方式…
****编辑1:****这是Excel所做的
****编辑2:****请注意,如果您使用“作为附件,php的fputcsv
与excel完全相同。
rdeslonde@mydomain.com Richard "This is what I think"
变成这样:
Email,Fname,Quoted rdeslonde@mydomain.com,Richard,"""This is what I think"""
感谢托尼和保罗的快速反馈,它非常有帮助。 我实际上通过POJO找出了一个解决scheme。 这里是:
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); }
简单地说,如果在单元格中的string中有逗号或双引号之类的特殊字符,则首先通过添加额外的双引号(如"\"\""
)来转义双引号( "\"\""
),然后将整件事情变成双引号(如"\""+theWholeThing+"\""
)
你也可以看看Python如何写入Excel兼容的csv
文件。
我相信Excel的默认值是将字面引号字符加倍 – 即文字引号"
写为""
。
"cell one","cell "" two","cell "" ,three"
将其保存到csv文件并查看结果,因此使用双引号来自行跳出
重要的提示
"cell one","cell "" two", "cell "" ,three"
会给你一个不同的结果,因为逗号后面有一个空格,那就会被当作“
我只是使用fputcsv($fp, $res,',',' ');
function并获得正确的csv。
String stringWithQuates = "\""+ "your,comma,separated,string" + "\"";
这将保留在CSV文件中的逗号