使用 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);
我看到一些关于 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);