【问题标题】:Using CSVWriter to write a string array - some with quotes and some without使用 CSVWriter 编写字符串数组 - 有些带引号,有些不带
【发布时间】:2021-10-15 05:22:32
【问题描述】:

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

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

【问题讨论】:

    标签: java csv opencsv csv-write-stream csvwriter


    【解决方案1】:

    首先:我假设您使用的是 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);
    

    【讨论】:

    • 是的,就是逃跑了。感谢那。是的,我在代码中犯了一个错误,它们最初是变量,我在变量中的字符串中添加了引号,并在字符串数组中使用了该变量。因此混乱。
    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2015-05-02
    • 2016-05-16
    • 2018-03-06
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多