java - 用引号将文本写入 CSV,但不使用引号写入数值

标签 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');

其中引号字符设置为 '\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

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

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

最佳答案

您可以将转义字符指定为 '\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 只是用逗号连接字符串数组。

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

关于java - 用引号将文本写入 CSV,但不使用引号写入数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24380883/

相关文章:

python - Pyschools 主题 13 Q 9 csv.writer

java - 使用java将大量数据从数据库导出到.csv时出现问题

ruby - 导轨 : CSV Array to string (convert)

java - Java 中 BigDecimal 的舍入模式

Python;科学记数法字符串转数字

java - Repaint() 重新定位按钮

mysql - 如何快速将非常大的 csv 文件导入 mysql?

python - Pandas df 到 csv 插入空行

java - 在 android 中使用简单列表项 2 时的 NPE

java - 如何使用 Java 收集器获取嵌套列表 <Long> 的串联