如何同时为CSV文件转义逗号和双引号?

2022-08-31 13:14:46

我正在编写一个Java应用程序,将数据从Oracle导出到csv文件

不幸的是,数据的内容可能非常棘手。逗号仍然是解调器,但行上的一些数据可能如下所示:

| ID    |   FN    |   LN   |  AGE   |  COMMENT                   |
|----------------------------------------------------------------|
| 123   |  John   |  Smith |   39   | I said "Hey, I am 5'10"."  |
|----------------------------------------------------------------|

所以这是列上的字符串之一:comment

我说:“嘿,我是5'10”。

不开玩笑,我需要从Java生成的CSV文件中在excel或open Office中显示上面的评论,当然也不能搞砸其他常规转义情况(即常规双引号和元组中的常规逗号)。我知道正则表达式很强大,但是我们如何才能在如此复杂的情况下实现目标呢?


答案 1

有几个库。下面是两个示例:


❐ Apache Commons Lang

Apache Commons Lang包含一个特殊的类来转义或取消scape字符串(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 取消缓存

    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,则无需担心转义或取消转义,只需编写或读取内容即可。

  • 写入文件:

    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();
    

*您可以从这里下载


答案 2

Excel必须能够处理完全相同的情况。

将这些东西放入Excel中,将它们保存为CSV,然后使用文本编辑器检查文件。然后,您将知道Excel应用于这些情况的规则。

使 Java 生成相同的输出。

顺便说一句,Excel使用的格式是已发布的...

编辑 1:**** 这是 Excel 所做的
**** 编辑 2:**** 请注意,如果您使用 “ 作为外壳,php 会执行与 Excel 完全相同的事情。fputcsv

rdeslonde@mydomain.com
Richard
"This is what I think"

转换为:

Email,Fname,Quoted  
rdeslonde@mydomain.com,Richard,"""This is what I think"""