如何使用 Open CSV 不让双引号加倍?

How to have not get the double quotes doubled with Open CSV?

我用 Open CSV(2.3 版)写了一个 CSV 文件。

我想在我的 CSV 文件中写入以下行: 这次冒险我选"hero"

但我没有找到正确的配置,最后我的行被打印在我的 CSV 文件中,如下所示: 我为这次冒险选择了一个“"hero"”

所以我的代码是:

CSVWriter writer = null;
writer  = new CSVWriter(outputStreamWriter,';',CSVWriter.NO_QUOTE_CHARACTER);

String[] lines = new String[4] ;

lines[0] = "Where is Brian" ;
lines[1] = "42" ;
lines[2] = "I choose a "hero" for this adventure" ;
lines[3] = "May the fourth be with you" ;

for (String line : lines ) {
    writer.writeNext(line );        
}

writer.close();

我怎样才能正确地写下我的台词?

也许我必须使用 CSVParser class?

转义引号

lines[2] = "I choose a \"hero\" for this adventure";

或者使用单引号:

lines[2] = 'I choose a "hero" for this adventure';

或者

lines[2] = "I choose a 'hero' for this adventure";

如文档所述: https://docs.oracle.com/javase/tutorial/java/data/characters.html

只需使用:

lines[2] = "I choose a \"hero\" for this adventure" ;

我找到了我的问题的解决方案,它不是最好的,因为它不是通用的,但它对我来说很有效。我必须调用以下函数:

public void replaceDoubledQuotesInFile(File file) throws IOException {

    File tempFile = new File("temp.csv");
    FileWriter fw = new FileWriter(tempFile);

    Reader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);

    while(br.ready()) {

        String readenLine = br.readLine();

        if(readenLine.contains("\"\"")){

            String str1 = readenLine.replaceAll("\"\"", "!");
            String str2 = str1.replaceAll("!", "\"");

            fw.write(str2 + "\n");
            }
        else{
            fw.write(readenLine + "\n");}
    }

    fw.close();
    br.close();
    fr.close();

    file.delete();
    tempFile.renameTo(file);
} 

您必须对输入进行转义,但如果您不想对输出进行转义,则可以使用 CSVWriter.NO_ESCAPE_CHARACTER 创建编写器。这是一个示例 JUnit,它显示了我在说什么。

@Test
public void embeddedQuoteInString() {
  String[] line = {"Foo", "I choose a \\"hero\\" for this adventure"};
  StringWriter sw = new StringWriter();
  CSVWriter csvw = new CSVWriter(sw, CSVWriter.DEFAULT_SEPARATOR, CSVWriter.DEFAULT_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER);
  csvw.writeNext(line);
  assertEquals("\"Foo\",\"I choose a \\"hero\\" for this adventure\"\n", sw.toString());
}