生成的csv文件中不需要的双引号

Edw*_*ard 29 java csv file-io opencsv supercsv

我使用下面的Java代码创建了一个CSV文件:

String csv = rs.getString("UPLOAD_FOLDER_PATH")+".csv";
CSVWriter writer = new CSVWriter(new FileWriter(csv));
String [] filevalues = new String[filevaluesarray.size()];

filevalues=filevaluesarray.toArray(filevalues);

writer.writeNext(filevalues);

writer.close();
Run Code Online (Sandbox Code Playgroud)

我收到了CSV文件,但该文件的内容包含不需要的双引号.

例如."ABC", "123", "KDNJ"

我不会从添加这些双引号的地方得到.

Sha*_*oor 47

这对我有用

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

请参阅CSVWriter javadoc

  • 仅供参考,此构造函数已弃用,但@giainel的答案似乎有效。 (3认同)

Jam*_*ett 15

您应该澄清"不需要的"引号的含义.

  1. 我不希望它引用所有内容,只包含包含嵌入式逗号,引号和换行符的字段(引用一切都是不必要的并使我的文件更大),或者

  2. 我不想要引用任何内容,并且我知道如果CSV包含嵌入的逗号,引号和换行符,则我的CSV将无效

如果它是第一个选项,那么opencsv不支持这个 - 它要么引用一切,要么什么都不引用.如果您想要一个仅在必要时引用的开源CSV库(如果需要也可以引用所有内容),请查看超级CSV.

如果这是第二个选项,那么请使用Sheldon的答案,但请注意,如果CSV包含嵌入的逗号,引号和换行符,则CSV将无效.

例如,如果我正在读取您的CSV文件,我怎么知道以下实际上只是一个包含2个字段的记录?

P Sherman, 42 Wallaby Way,
Sydney, AUSTRALIA
Run Code Online (Sandbox Code Playgroud)

如果它被正确引用,那将是显而易见的,即

P Sherman, "42 Wallaby Way,
Sydney, AUSTRALIA"
Run Code Online (Sandbox Code Playgroud)

仅供参考,这是与RFC4180(CSV的MIME类型定义)的引用相关的规则.

5 每个字段可能包含也可能不包含在双引号中(但是某些程序,例如Microsoft Excel,根本不使用双引号).如果字段未用双引号括起来,则双引号可能不会出现在字段内.例如:

   "aaa","bbb","ccc" CRLF
   zzz,yyy,xxx
Run Code Online (Sandbox Code Playgroud)

6 包含换行符(CRLF),双引号和逗号的字段应括在双引号中.例如:

   "aaa","b CRLF
   bb","ccc" CRLF
   zzz,yyy,xxx
Run Code Online (Sandbox Code Playgroud)

7 如果使用双引号括起字段,则必须通过在其前面加上另一个双引号来转义出现在字段内的双引号.例如:

   "aaa","b""bb","ccc"
Run Code Online (Sandbox Code Playgroud)

  • SuperCSV链接为+1.我试图在你的答案中完成你在场景#1中描述的内容.SuperCSV做得很好.我已经确认它处理我最常见的问题字符(读写):逗号,单引号/撇号,双引号.谢谢你的推荐! (2认同)
  • 自去年以来的报价情况并非如此。现在CSVWriter.writeNext(String [] nextLine,boolean applyQuotesToAll)中有一个选项,其中applyQuotesToAll为“如果所有值都用引号引起,则为True。False仅将引号应用于包含分隔符,转义符,引号或换行符的值”。(javadoc)。项目在不断发展,但是对于SuperCSV我不会说同样的话。 (2认同)

gia*_*nel 7

如果您不希望在生成的CSV文件的值中使用引号,则必须通过以下方式创建CSVWriter对象:

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

关键是CSVWriter.NO_QUOTE_CHARACTER。您可以自定义其他构造函数参数的值。