使用 CSVWriter 写一个字符串数组 - 有些有引号,有些没有

Using CSVWriter to write a string array - some with quotes and some without

我看到一些关于 CSVWriter 写入文件和引用的其他问题。但没有什么比我的问题更具体了。

我想打印如下内容:

abc,def,ghi,"jkl",mno,pqr

刚写的时候:

CSVWriter writer = new CSVWriter(new FileWriter(getFullPathToTestFile(), true));
String[] newLine = { "abc","def","ghi","jkl","mno","pqr" };
writer.writeNext(newLine);

打印出来的是:

"abc","def","ghi","jkl","mno","pqr"

所以我尝试了:

CSVWriter writer = new CSVWriter(new FileWriter(getFullPathToTestFile(), true), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
String[] newLine = { "abc","def","ghi","jkl","mno","pqr" };
writer.writeNext(newLine);

这给了我:

abc,def,ghi,jkl,mno,pqr

但我需要 jkl 上的引号。所以我尝试了类似的东西:

CSVWriter writer = new CSVWriter(new FileWriter(getFullPathToTestFile(), true), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
String[] newLine = { "abc","def","ghi","\""+"jkl"+"\"","mno","pqr" };
writer.writeNext(newLine);

令人惊讶的是:

abc,def,ghi,""jkl"",mno,pqr

我现在没主意了。有人可以帮助我理解这一点吗?如果有任何关于让它发挥作用的提示,我将不胜感激。

首先:我假设您使用 com.opencsv.CSVWriter 并且我指的是 http://opencsv.sourceforge.net/apidocs/com/opencsv/CSVWriter.html

上的文档

示例数组中的语法错误。 abc,def,.. 如果你不引用它们将是变量,所以它可能应该读作

String[] newLine = { "abc","def","ghi","\"jkl\"","mno","pqr" };

此外,从文档中我看到

CSVWriter(Writer writer, char separator, char quotechar, char escapechar, String lineEnd)

但是在您的代码中您只使用了 separator 和 quotechar 参数,没有指定 escapechar 或 lineEnd。我假设它们将在您的库版本中设置为默认值。

因此,您告诉 csvWriter 使用“逗号”作为值之间的分隔符并明确不使用引号,而是转义并使用默认行结尾。 当 csvWriter 遇到您的“jkl”中的引号时,它会尝试通过默认机制(加倍引号)对其进行转义。

您可以尝试将引号添加到源代码中并同时禁用转义

CSVWriter writer = new CSVWriter(new FileWriter(getFullPathToTestFile(), true), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);

取决于您的用例,这可能就足够了,但会中断,例如如果您在任何值中有逗号。

作为替代方案,您可以编写自己的 Writer 实现,它采用 CSVWriter 的输出并应用正则表达式在第 N 列上添加引号。

CSVWriter writer = new CSVWriter(new RegexpReplaceWriter(new FileWriter(getFullPathToTestFile(), true)), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);