今天发现一个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