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

时间:2013-03-12 16:35:56

标签: java opencsv

我正在填充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”

如何将文字写入文件但不包括引号?

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

10 个答案:

答案 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构造函数和正确的编码:

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

答案 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,表示是否要将标题列(表列名称)写入文件。