关于Java:防止opencsv将引号写入.csv文件

您所在的位置:网站首页 opencsv写入 关于Java:防止opencsv将引号写入.csv文件

关于Java:防止opencsv将引号写入.csv文件

2023-12-18 04:11| 来源: 网络整理| 查看: 265

我正在从resultSet填充文件,如下所示:

1234567891011      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。因此,您的作者将如下所示:

1CSVWriter writer = new CSVWriter(new FileWriter(fileName), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);

相关讨论 但是,如果使用NO_QUOTE_CHARACTER,是否仍在需要时引用它?如果我正确理解CSV,则仅当字符串中包含换行符,逗号等时才需要使用引号。但是,OpenCSV总是添加引号,使其不合规且不可用。这样可以解决吗? 如果该方法在行的末尾:public CSVWriter(Writer writer,char separator,char quotechar,String lineEnd),则该方法应起作用。您可以在此处找到更多信息[opencsv.sourceforge.net/apidocs/au/com/bytecode/openc sv /。我只是强调您可以使用(常量字段值)[opencsv.sourceforge.net/apidocs/ 有一个更新的解决方案,无需更改quotechar。看我的答案。

更新(2019年10月16日):现在可以在更高版本的OpenCSV中使用。请参阅西科的答案。

TL; DR您不能使用OpenCSV v2.3做到这一点。但是您可以使用Commons CSV。

OpenCSV(v2.3)似乎没有提供一种在不需要时关闭引号的安全方法。对于没有分隔符或行尾字符的值,通常不需要使用引号。

有人建议使用NO_QUOTE_CHARACTER:

123CSVWriter 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表示形式为:

1Black and white,Red, yellow and blue

此数据的更有效表示形式是,仅在需要时才使用引号:

1Black and white,"Red, yellow and blue"

我没有使用Commons CSV,但是它似乎通过QuoteMode.MINIMAL提供了以下功能:

Quotes fields which contain special characters such as a delimiter, quote character or any of the characters in line separator.

相关讨论 CommonsCSV具有CSVPrinter,而不是WRiter。您在使用其他库吗? @StealthRabbi我的答案中的代码与OpenCSV相关,以显示其如何不提供所需的功能。 @ vegemite4me现在可以使用OpenCSV。我不知道哪个版本引入了它,但是我使用的是4.6版本,它可以工作。看我的答案。 @Sikor很好听到。我已经用您的答案的链接更新了我的答案(并给了+1)。

由于当有人寻找OpenCSV和引号问题时,此问题会在Google搜索结果中排在第一位,因此我将在此处添加更新的解决方案。

我使用的是4.6版,确实可以跳过引号,而将引号完整地包含在分隔符char中。

样例代码:

1234567891011List csvEntries = new ArrayList(); csvEntries.add(new SomeCsvEntryTO("sdf1","sdf2")); csvEntries.add(new SomeCsvEntryTO("hgh1","hgh2;hghgh2")); Writer writer = new FileWriter(filePath); StatefulBeanToCsv csvWriter = new StatefulBeanToCsvBuilder(writer)         .withSeparator(';')         .withApplyQuotesToAll(false)         .build(); csvWriter.write(csvEntries); writer.close();

SomeCsvEntryTO:

12345678public class SomeCsvEntryTO{    @CsvBindByName(column ="sample1colname")    private String sample1;    @CsvBindByName(column ="sample2colname")    private String sample2; }

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

这将产生以下结果:

123SAMPLE1COLNAME;SAMPLE2COLNAME sdf1;sdf2 hgh1;"hgh2;hghgh2"

是。同一包中有一个CSVWriter,其语义与CSVReader相同。例如,编写一个制表符分隔的文件:

12345CSVWriter 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客户端时,这很方便)。为此有一个构造函数参数。

有关写出文件时如何使用NO_QUOTE_CHARACTER构造函数和正确编码的信息,请参见以下链接:

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

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

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

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

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

从5.x版本开始,这对我有用

1234import static com.opencsv.ICSVParser.*; ... new CSVWriter(writer, DEFAULT_SEPARATOR, NO_QUOTE_CHARACTER, DEFAULT_ESCAPE_CHARACTER, DEFAULT_LINE_END)

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

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

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

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3