使用引号中的文本写入CSV,但不带引号的数值

时间:2014-06-24 07:34:47

标签: java csv export-to-csv opencsv

使用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',即空char(并且分隔符像往常一样保留为,)。

这不会在任何值周围添加引号。为了弥补文本值周围缺少"引号,I"手动"在每个文本值之前添加并附加一个简短的引用"\""(这是非常易于管理的,因为我的标题实际上只是其中包含文本的唯一内容)。

    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

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

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

2 个答案:

答案 0 :(得分:1)

AFAIK CSV规范(http://tools.ietf.org/html/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)

答案 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只是用逗号连接字符串数组。

放弃图书馆并自己编写少量代码可能是明智的 - 这将避免让未来的维护者感到困惑,他们认为“嗯,这是我们在这里制作的奇怪的CSV数据!” EM>”。