我正在尝试使用CSVWriter
库编写一个简单的OpenCSV
代码,但它有一个奇怪的问题。
代码:
public class Test {
public static void main(String[] args) throws IOException {
String[] header = {"ONE", "\"TWO\"", "\"THREE\"", "\"FOUR\""};
CSVWriter writer = new CSVWriter(new FileWriter("C:/test.csv"), '|', CSVWriter.NO_QUOTE_CHARACTER);
writer.writeNext(header);
writer.flush();
writer.close();
}
}
预期产出:
ONE|"TWO"|"THREE"|"FOUR"
实际输出:
ONE|""TWO""|""THREE""|""FOUR""
我们可以看到有两个,三个和四个双引号,但在输出中双引号重复。
我不想这样,已经尝试了CSVWriter
类的几个选项和构造函数,但无法对此进行排序。
任何人遇到类似问题或知道出路?
由于
答案 0 :(得分:2)
让它工作,下面的构造函数工作:
CSVWriter writer = new CSVWriter(new FileWriter("C:/test.csv"), '|', CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER);
原因我发现默认情况下CSVWriter
正在考虑将"
作为转义字符,因此如果它出现在字符串中,它会尝试 Escape "
与DEFAULT_ESCAPE_CHARACTER
"
本身不是CSVWriter.NO_ESCAPE_CHARACTER
。
通过传递{{1}},Writer不会担心检查 Escapes 之间是否有任何需要。
答案 1 :(得分:0)
如果您使用的是com.opencsv.bean.StatefulBeanToCsv
构建的com.opencsv.bean.StatefulBeanToCsvBuilder
而不是com.opencsv.CSVWriter
;
您不能直接将选项设置为构造函数参数,但是必须通过调用相应的方法进行设置:.withQuotechar()
和.withEscapechar()
赞:
StatefulBeanToCsvBuilder btcsvBuilder = new StatefulBeanToCsvBuilder(myOutputStreamWriter);
StatefulBeanToCsv btcsv = btcsvBuilder.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER).withEscapechar(CSVWriter.NO_ESCAPE_CHARACTER).withMappingStrategy(myMapStrategy).withSeparator(',').build();