如何使用 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());
}
我用 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());
}