11

我正在从 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"

如何将文本写入文件但不包含引号?

当我将条目打印到控制台时,不会打印双引号,所以我不知道它们被添加到哪里?

4

10 回答 10

23

只是为了扩展 Matten 的答案,使用 CSVWriter 中的内置字符来指定quotechar. 所以你的作家看起来像下面这样:

CSVWriter writer = new CSVWriter(new FileWriter(fileName), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
于 2014-03-23T19:54:41.553 回答
6

由于当有人查找 OpenCSV 和引号问题时,这个问题在谷歌搜索结果中首先出现,所以我将在此处添加更新的解决方案。

我使用的是 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;
}

正如您在上面看到的,我使用分号作为分隔符,并且没有更改引号字符。只需更改withApplyQuotesToAllfalse.

这会产生以下结果:

SAMPLE1COLNAME;SAMPLE2COLNAME
sdf1;sdf2
hgh1;"hgh2;hghgh2"
于 2019-10-16T11:03:28.180 回答
4

更新(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它可以执行以下操作:

引用包含特殊字符的字段,例如分隔符、引号字符或行分隔符中的任何字符。

于 2015-02-11T10:20:02.497 回答
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 客户端时很方便)。为此目的有一个构造函数参数。

于 2016-06-23T21:22:57.007 回答
1

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

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

于 2015-03-31T07:24:20.260 回答
1

writer的构造函数代码允许您提供转义字符 ( quotechar):

CSVWriter(Writer writer, char separator, char quotechar)

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

CSVWriter(Writer writer, char separator, char quotechar, char escapechar)
于 2013-03-12T16:39:48.003 回答
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);
于 2021-04-07T09:22:23.660 回答
0

这是自 5.x 版以来对我有用的方法

import static com.opencsv.ICSVParser.*;

...
new CSVWriter(writer, DEFAULT_SEPARATOR, NO_QUOTE_CHARACTER, DEFAULT_ESCAPE_CHARACTER, DEFAULT_LINE_END)
于 2020-10-06T15:14:57.350 回答
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);
于 2020-12-09T20:17:55.850 回答
-1

您可以使用Constructor@Matten 提到的 ,同时使用另一个writeAll()CSVWriter.

OpenCSV还支持将数据从 SQL 表直接转储到 CSV。为此,我们需要 ResultSet 对象。以下API可用于将数据从 ResultSet 写入 CSV。

java.sql.ResultSet myResultSet = getResultSetFromSomewhere();
writer.writeAll(myResultSet, includeHeaders);

writeAll(ResultSet, boolean)方法用于此。第一个参数是ResultSet您要写入CSV文件的参数。第二个参数boolean表示是否要将标题列(表列名称)写入文件。

于 2013-03-12T16:44:39.013 回答