[英]Double Quotes getting duplicated while writing CSV file with OpenCSV
[英]Prevent opencsv from writing quotes to .csv file
我正在从 resultSet 填充文件,如下所示:
while(rs.next()){
String[] entries = new String[3];
entries[0] = rs.getString(1);
entries[1] = ",";
entries[2] = rs.getString(2);
println("entries : "+entries);
writer.writeNext(entries);
}
当我打开 excel 文件时,值在它们周围包含双引号。 所以当从数据库读取并写入 .csv 文件时 test1,test2,test3 变为 "test1","test2","test3"
如何将文本写入文件但不包含引号?
当我将条目打印到控制台时,没有打印双引号,所以我不知道它们被添加到哪里?
只是为了扩展 Matten 的答案,使用 CSVWriter 中的内置字符来指定quotechar
。 所以你的作者看起来像下面这样:
CSVWriter writer = new CSVWriter(new FileWriter(fileName), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
更新(2019 年 10 月 16 日):现在可以使用更高版本的 OpenCSV。 请参阅Sikor 的回答。
TL;DR你不能用 OpenCSV v2.3 做到这一点。 但是您可以使用Commons CSV 。
OpenCSV (v2.3) 似乎没有提供在不需要引号时关闭引号的安全方法。 对于没有分隔符或行结束符的值,通常不需要引号。
使用NO_QUOTE_CHARACTER
正如一些人所建议的:
CSVWriter writer = new CSVWriter(new FileWriter("data.csv"), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
String[] someData = new String[] {"Black and white", "Red, yellow and blue"};
writer.writeNext(someData);
产生不正确的CSV 表示为:
Black and white,Red, yellow and blue
此数据的更有效表示,仅在需要时使用引号是:
Black and white,"Red, yellow and blue"
我没有使用Commons CSV ,但它似乎通过QuoteMode.MINIMAL
提供了这种能力,它执行以下操作:
引用字段包含特殊字符,例如分隔符、引号字符或行分隔符中的任何字符。
是的。 在同一个包中有一个 CSVWriter,它遵循与 CSVReader 相同的语义。 例如,要编写一个制表符分隔的文件:
CSVWriter writer = new CSVWriter(new FileWriter("yourfile.csv"), '\t');
// feed in your array (or convert your data to an array)
String[] entries = "first#second#third".split("#");
writer.writeNext(entries);
writer.close();
如果您更喜欢使用自己的引号字符,则可以使用构造函数的三个 arg 版本,它接受一个引号字符(或随意传入 CSVWriter.NO_QUOTE_CHARACTER)。
您还可以自定义生成文件中使用的行终止符(这在您从 Linux Web 应用程序导出到 Windows 客户端时很方便)。 为此有一个构造函数参数。
由于当有人查找 OpenCSV 和引号问题时,这个问题首先出现在 google 结果中,因此我将在此处添加较新的解决方案。
我使用的是 4.6 版,确实可以跳过引号,同时保留包含分隔符字符的整体引号。
示例代码:
List<SomeCsvEntryTO> csvEntries = new ArrayList<>();
csvEntries.add(new SomeCsvEntryTO("sdf1", "sdf2"));
csvEntries.add(new SomeCsvEntryTO("hgh1", "hgh2;hghgh2"));
Writer writer = new FileWriter(filePath);
StatefulBeanToCsv<SomeCsvEntryTO> csvWriter = new StatefulBeanToCsvBuilder<SomeCsvEntryTO>(writer)
.withSeparator(';')
.withApplyQuotesToAll(false)
.build();
csvWriter.write(csvEntries);
writer.close();
SomeCsvEntryTO:
public class SomeCsvEntryTO{
@CsvBindByName(column = "sample1colname")
private String sample1;
@CsvBindByName(column = "sample2colname")
private String sample2;
}
正如您在上面看到的,我使用分号作为分隔符并且我没有更改quotechar。 只需将withApplyQuotesToAll
更改为false
。
这会产生以下结果:
SAMPLE1COLNAME;SAMPLE2COLNAME
sdf1;sdf2
hgh1;"hgh2;hghgh2"
请参阅此链接,了解在写出文件时如何使用 NO_QUOTE_CHARACTER 构造函数和正确编码:
这是自 5.x 版以来对我有用的方法
import static com.opencsv.ICSVParser.*;
...
new CSVWriter(writer, DEFAULT_SEPARATOR, NO_QUOTE_CHARACTER, DEFAULT_ESCAPE_CHARACTER, DEFAULT_LINE_END)
使用此模式防止双引号(在 5.3 版本上检查)
CSVWriter writer = new CSVWriter(new FileWriter(filename), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);
很长一段时间和许多有效的答案,但从 2021 和 v5 开始,我眼中最干净的解决方案是使用具有定义常量的构建器。 与固定构造函数相比,这允许您对 CsvWriter 进行更多控制。
import static com.opencsv.ICSVWriter.*;
CSVWriterBuilder builder = new CSVWriterBuilder(new FileWriter("yourfile.csv"));
ICSVWriter csvWriter = builder
.withQuoteChar(NO_QUOTE_CHARACTER)
.build();
csvWriter.writeAll(rs, true);
您可以使用Constructor
由@Matten,沿着与所提到的,使用其他writeAll()的CSVWriter
。
OpenCSV还支持将数据从 SQL 表直接转储到 CSV。 为此,我们需要 ResultSet 对象。 以下API可用于将数据从 ResultSet 写入 CSV。
java.sql.ResultSet myResultSet = getResultSetFromSomewhere();
writer.writeAll(myResultSet, includeHeaders);
writeAll(ResultSet, boolean)
方法用于此目的。 第一个参数是要写入CSV文件的ResultSet
。 第二个参数是boolean
,表示是否要将标题列(表列名称)写入文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.