0

我看到了一些关于 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

在这一点上,我没有想法。有人可以帮助我理解这一点,并且任何有关使其正常工作的提示也将不胜感激。

4

1 回答 1

2

首先:我假设您使用 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);
于 2021-08-11T18:59:05.440 回答