使用CSVWriter编写字符串数组——有些带引号,有些不带引号



我看到关于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)

,但在代码中只使用分隔符和引号参数,不指定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);

最新更新