有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java编写CSV,文本加引号,数值不加引号

使用OpenCSV,我试图编写一个CSV文件,其中

  • 文本值被"引号包围
  • 数值而不是被引号包围(因为它们应该被最终读取CSV文件的程序视为数字,而不是字符串)

所需输出示例:

读取CSV文件的程序所需的格式:

"Header 1","Header 2","Header 3"
123.4,234.6,999.8
456456.32,1222.4,2222.2

尝试的解决方案:

到目前为止,我最好的尝试是:

CSVWriter csvWriter = new CSVWriter(new FileWriter(csvFile),',','\0');

其中引号char被设置为'\0',即空字符(分隔符像往常一样保留为,

这不会在任何值周围加引号。为了弥补文本值周围缺少"引号的缺陷,我“手动”在每个文本值前面加上一个"\""引号(这是非常容易管理的,因为我的标题实际上是唯一包含文本的东西)

    for (int i=0;i<headers.length;++i) {
        headers[i] = "\"" + headers[i] + "\"";
    }

实际输出:

我真的以为这会解决问题,但结果是这样的:

""Header 1"",""Header 2"",""Header 3""
123.4,234.6,999.8
456456.32,1222.4,2222.2

文本值用双引号括起来""

  • 为什么
  • 我该怎么解决这个问题

共 (1) 个答案

  1. # 1 楼答案

    您可以将转义字符指定为'\0',这将阻止OpenCSV转义您现有的引号:

    CSVWriter csvWriter = new CSVWriter(new OutputStreamWriter(System.out),
            ',', '\0', '\0');
    csvWriter.writeNext(new String[] { "\"Header 1\"", "\"Header 2\"",
            "\"Header 3\"" });
    csvWriter.writeNext(new String[] { "123.4", "234.6", "999.8" });
    csvWriter.close();
    

    输出:

    "Header 1","Header 2","Header 3"
    123.4,234.6,999.8
    

    当然,你很快就到达了OpenCSV对你毫无帮助的阶段。如果处理所有转义和引用,那么OpenCSV只是将字符串数组与逗号连接起来

    放弃这个库并自己编写少量代码可能是明智的——这将避免未来的维护人员感到困惑,他们认为“Hmmm,这是我们在这里生成的非常奇怪的CSV数据!