编写带引号的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),',','');

,其中引号字符设置为'',即空字符(分隔符像往常一样保留为,)。

不给任何值加上引号。为了弥补文本值周围缺乏"引号,我"手动"在每个文本值前加上字面引用"""(这是相当可管理的,因为我的标题实际上只是其中包含文本的唯一东西)。

    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

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

  • 为什么?
  • 我如何解决这个问题?

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

CSVWriter csvWriter = new CSVWriter(new OutputStreamWriter(System.out),
        ',', '', '');
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只是用逗号连接字符串数组。

放弃库并自己编写这一小部分代码可能是明智的-这将避免未来的维护者认为"嗯,我们在这里生成的这是非常奇怪的CSV数据!"的困惑。

AFAIK CSV规范(https://www.rfc-editor.org/rfc/rfc4180)声明值中的双引号通过将它们加倍来转义,因此我假设如果您自己提供双引号,它们将被转义,并且仅当值包含分隔符 OpenCSV将其括在双引号中。

示例(分隔符为逗号):

Input           CSV
--------------------------------
test text    -> test
test, text   -> "test, text"     (double quotes because of the delimiter in the input)
"test text"  -> ""test text""    (double quotes are escaped)
"test, text" -> """test, text""" (double quotes because of delimiter, as well as escaped quotes)

相关内容

  • 没有找到相关文章

最新更新