繁体   English   中英

防止 opencsv 将引号写入 .csv 文件

[英]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"

编写器构造函数代码允许您提供转义字符 ( quotechar ):

CSVWriter(Writer writer, char separator, char quotechar)

如果这是错误的,还有另一个带有转义字符的构造函数:-)

CSVWriter(Writer writer, char separator, char quotechar, char escapechar)

请参阅链接,了解在写出文件时如何使用 NO_QUOTE_CHARACTER 构造函数和正确编码:

https://stackoverflow.com/a/29362439/1454926

这是自 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM