我正在填充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文件时,值包含双引号。所以test1,test2,test3从数据库中读取并写入.csv文件时变为“test1”,“test2”,“test3”
如何将文字写入文件但不包括引号?
当我将条目打印到控制台时,不会打印双引号,所以我不知道它们的添加位置在哪里?
答案 0 :(得分:19)
为了扩展Matten的答案,请使用CSVWriter中的内置字符指定quotechar
。所以你的作家看起来如下:
CSVWriter writer = new CSVWriter(new FileWriter(fileName), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
答案 1 :(得分:4)
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
提供此功能,该功能执行以下操作:
引用包含特殊字符的字段,例如分隔符,引号字符或行分隔符中的任何字符。
答案 2 :(得分:3)
是。在同一个包中有一个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客户端时,这很方便)。为此目的有一个构造函数参数。
答案 3 :(得分:2)
由于当有人寻找OpenCSV和引号问题时此问题首先出现在Google搜索结果中,因此我将在此处添加更新的解决方案。
我正在使用4.6版,确实可以跳过引号,而将引号完整地包含在分隔符char中。
示例代码:
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。只需将withApplyQuotresToAll
更改为false
。
这将产生以下结果:
SAMPLE1COLNAME;SAMPLE2COLNAME
sdf1;sdf2
hgh1;"hgh2;hghgh2"
答案 4 :(得分:1)
constructor code of the writer允许您提供转义字符(quotechar
):
CSVWriter(Writer writer, char separator, char quotechar)
如果这是错误的,那么还有另一个具有转义字符的构造函数: - )
CSVWriter(Writer writer, char separator, char quotechar, char escapechar)
答案 5 :(得分:1)
请参阅this链接,了解如何在写出文件时使用NO_QUOTE_CHARACTER构造函数和正确的编码:
答案 6 :(得分:0)
从5.x版本开始,这对我来说是有效的
import static com.opencsv.ICSVParser.*;
...
new CSVWriter(writer, DEFAULT_SEPARATOR, NO_QUOTE_CHARACTER, DEFAULT_ESCAPE_CHARACTER, DEFAULT_LINE_END)
答案 7 :(得分:0)
使用此模式可以防止双引号(在5.3版本中选中)
CSVWriter writer = new CSVWriter(new FileWriter(filename), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);
答案 8 :(得分:0)
很长一段时间和许多有效的答案,但从 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);
答案 9 :(得分:-1)
您可以使用@Matten提及的Constructor
,并使用CSVWriter
的其他writeAll()。
OpenCSV 还支持将数据从SQL表直接转储到CSV。为此,我们需要ResultSet对象。可以使用 API 将数据从ResultSet写入CSV。
java.sql.ResultSet myResultSet = getResultSetFromSomewhere();
writer.writeAll(myResultSet, includeHeaders);
writeAll(ResultSet, boolean)
方法用于此目的。第一个参数是您要写入 CSV 文件的ResultSet
。第二个参数是boolean
,表示是否要将标题列(表列名称)写入文件。