关于Java:防止opencsv将引号写入.csv文件 |
您所在的位置:网站首页 › opencsv写入 › 关于Java:防止opencsv将引号写入.csv文件 |
我正在从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 |