java csv 双引号_关于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[i] =""" + headers[i] +""";

}

实际输出:

我真的以为这会钉住它,但是输出看起来像这样:

""Header 1"",""Header 2"",""Header 3""

123.4,234.6,999.8

456456.32,1222.4,2222.2

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

为什么?

我该如何解决?

我不太明白你。 CSV规范指出,包含定界符的数据可能会转义该定界符或将其加引号。 无需引用所有可能包含引号的数据。 由于这不是CSV规范的一部分,因此OpenCSV无法处理它。 您正在寻找更类似于JSON数组的内容。

@BoristheSpider当您说"规范"时,是指RFC 4180吗? 如果是这样,请记住OpenCSV网站不会引用该RFC。 因此,尽管我认为您的意见可能是正确的,但对于提倡大多数实现都遵循某个规范的想法,我还是持谨慎态度。

@邓肯,是的-我是。 我只是假设OpenCSV跟在其后。 是的,我知道您假设时会发生什么。

@Jean仅仅是包含文本的标题吗?

@邓肯:是的,现在只是标题。 您先前的评论也是正确的。

@ Jean-FranoisCorbett好地方(重复):-)

您可以将转义字符指定为'\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数据!"。

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)

哪个CSV规格?

在我的问题中,我竭尽全力指定所需的输出格式,因为这是我保证链中下一个程序将能够读取的唯一格式。

@邓肯:tools.ietf.org/html/rfc4180

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值