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

blu*_*sky 7 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);

      }
Run Code Online (Sandbox Code Playgroud)

当我打开excel文件时,值包含双引号.所以test1,test2,test3从数据库读取并写入.csv文件时变为"test1","test2","test3"

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

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

obs*_*kie 20

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

CSVWriter writer = new CSVWriter(new FileWriter(fileName), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果您使用`NO_QUOTE_CHARACTER`,它是否仍然需要时引用?如果我正确理解CSV,只有在字符串中存在换行符,逗号等时才需要引号.但是,OpenCSV总是添加引号,使其不兼容且无法使用.这解决了吗? (5认同)

Sik*_*kor 8

由于当有人查找 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();
Run Code Online (Sandbox Code Playgroud)

SomeCsvEntryTO:

public class SomeCsvEntryTO{

   @CsvBindByName(column = "sample1colname")
   private String sample1;

   @CsvBindByName(column = "sample2colname")
   private String sample2;
}
Run Code Online (Sandbox Code Playgroud)

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

这会产生以下结果:

SAMPLE1COLNAME;SAMPLE2COLNAME
sdf1;sdf2
hgh1;"hgh2;hghgh2"
Run Code Online (Sandbox Code Playgroud)


Sud*_*hul -2

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

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

java.sql.ResultSet myResultSet = getResultSetFromSomewhere();
writer.writeAll(myResultSet, includeHeaders);
Run Code Online (Sandbox Code Playgroud)

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