如何在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文件中的逗号