csv文本编辑引号问题

Posted 巅峰寂寞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csv文本编辑引号问题相关的知识,希望对你有一定的参考价值。

今天发现一个csv的一个问题,csv工具类对于引号默认有特殊的处理。我希望写出来的结果是

1,"1",1

原来的代码是

CsvWriter cw=new CsvWriter("test.csv", ‘,‘, Charset.forName("GBK"));
String[] tsr=new String[]{"1","\"1\"","1"};
cw.writeRecord(tsr);

结果是

1,"""1""",1

 

多了2个引号,后面经过查询API(网址:http://javacsv.sourceforge.net/com/csvreader/CsvWriter.html

 

发现了一个方法

 

CsvWriter cw=new CsvWriter("test.csv", ‘,‘, Charset.forName("GBK"));
cw.setUseTextQualifier(false); String[] tsr=new String[]{"1","\"1\"","1"}; cw.writeRecord(tsr);

结果对了:

1,"1",1

 

手动输出scv的默认配置:

            System.out.println(cw.getForceQualifier());
            System.out.println(cw.getTextQualifier());
            System.out.println(cw.getUseTextQualifier());

结果:

false
"
true

(未看源码,以下全是猜测)
也就是说,csv默认使用引号作为文本限制符,当设置getUseTextQualifier为true的时候,如果文本要输出这个限制符,则这个文本本身会被限制符包围,并且还有一个限制符会作为作为转义符出现

下面使用程序验证下,我们把限制符改为“#”,然后试一下

cw.setTextQualifier(‘#‘);
cw.setUseTextQualifier(true);            
String[] tsr=new String[]{"1","#1","1"};
cw.writeRecord(tsr);

结果为:

1,###1#,1

注意, "#1"只有前面有限制符,后面没有,但是结果却是  ###1#   ,说明第一个是限制符,第二个是转义,第三个是我们的,第四个是限制符

 

接下来,如果我要的结果是:

"1","1","1"

 

那我需要在代码里都加上  \" 吗?即

String[] tsr=new String[]{"\"1\"","\"1\"","\"1\""};

答案是不需要。

cw.getForceQualifier() 意思是是否强制输出限制符,默认是false,这里设置为true即可全部输出

下面看代码:

cw.setForceQualifier(true);
cw.setTextQualifier(‘"‘);
cw.setUseTextQualifier(false);
String[] tsr=new String[]{"1","\"1","1"};
cw.writeRecord(tsr);

 输出结果是:

"1","1","1"

 

反过来设为默认false看看结果

cw.setForceQualifier(false);
cw.setTextQualifier(‘"‘);
cw.setUseTextQualifier(false);
String[] tsr=new String[]{"1","\"1","1"};
cw.writeRecord(tsr);

1,"1,1

 








以上是关于csv文本编辑引号问题的主要内容,如果未能解决你的问题,请参考以下文章

通过 PhpExcel 导出 csv 文件时从文本中删除双引号并用记事本打开它

删除文本中所有双引号(python csv)

使用 String.split() 将带有引号的 csv 文件拆分为文本分隔符

请教高手:csv文件用excel打开另存后,如何把单元格格式中的“”双引号去掉,直接转换为文本格式

用于 CSV 拆分的正则表达式,包括多个双引号

vb.net xls 到 csv 带引号?