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

我使用下面的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(); 

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

例如。 “ABC”, “123”, “KDNJ”

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

这对我有用

 CSVWriter writer = new CSVWriter(new FileWriter(csv), ',', CSVWriter.NO_QUOTE_CHARACTER); 

请参阅CSVWriter javadoc

您应该澄清“不需要的”引号的含义。

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

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

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

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

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

 P Sherman, 42 Wallaby Way, Sydney, AUSTRALIA 

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

 P Sherman, "42 Wallaby Way, Sydney, AUSTRALIA" 

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

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

  "aaa","bbb","ccc" CRLF zzz,yyy,xxx 

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

  "aaa","b CRLF bb","ccc" CRLF zzz,yyy,xxx 

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

  "aaa","b""bb","ccc" 

如果您不想在生成的CSV文件的值中使用引号,则必须以这种方式创建CSVWriter对象:

 CSVWriter writer = new CSVWriter(new FileWriter(filePath), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.DEFAULT_ESCAPE_CHARACTER, CSVWriter.RFC4180_LINE_END); 

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

private void writeFile(String fileAbsolutePath,ListcsvLines)抛出IOException {

  final char csvDelimeter = ','; CSVWriter csvWriter = new CSVWriter(new FileWriter(new File(fileAbsolutePath)),csvDelimeter,CSVWriter .NO_QUOTE_CHARACTER); CSVParser parser = new CSVParser(); for(String csvLine : csvLines){ String[] csvVals = parser.parseLine(csvLine); csvWriter.writeNext(csvVals); } csvWriter.flush(); } 

调用:writeFile(fileAbsolutePath,csvLinesList);

Shamis回答的工作示例,对我来说很好。

我也面临与打开csv相同的问题,并修复我使用转义字符的问题。

对于前:

 CSVReader csvReader = new CSVReader(new FileReader(fileName), seprator,escaped_character); 

在这里打开csv默认使用双引号作为escape_character(根据我的知识)

在我的情况下,我使用分隔符作为管道标志(|)

A2 | GAA | Thilina | 9022V | 1 | 2 | 3 | 4 | “Rubasingha” |“ABC |马特勒”| ‘否’ | 2012 | 1668.88

在这里“Rubasingha”打开并关闭双引号,在“否”中也打开并关闭单引号。 这两个在默认打开的csv中完美地工作

但是当我们使用‘Abc – 只打开单引号 – 这也可行

MATARA“ OR ”MATARA – 在这里我们有一个双引号 – 在我的情况下,这会在使用open csv读取CSV时产生错误

为了解决这个问题我引用了这个页面( http://cs.swan.ac.uk/~csbob/teaching/java/JavaDemoNetbeans/opencsv-2.3/doc/

有一些构造函数可以满足您自己的分隔符和引号字符的需求。 假设您正在为分隔符使用选项卡,您可以执行以下操作:

 CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t'); 

如果您单引用转义字符而不是双引号,则可以使用三个arg构造函数:

 CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\''); 

如果您知道文件中的内容直到稍后才开始,您也可以跳过文件的前几行。 因此,例如,您可以通过执行以下操作跳过前两行:

 CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'', 2); 

所以我将我的默认转义字符更改为(^)符号,而不使用双引号作为转义字符。

 CSVReader csvReader = new CSVReader(new FileReader(fileName), '|','^'); 

这是我解决问题的方法。 谢谢

我有一种情况,我面临的数据显示在我的.csv文件中,两边都有三个引号。 这是因为我的数据在excel中有引号。 第二个我创建了一个.csv文件,我会打开以查看所需的更多引用。 经过网上搜索后,我找到了一些代码并调整以适合我,如下: –

  Public Sub OutputQuotedCSV() Const QSTR As String = "" Dim myRecord As Range Dim myField As Range Dim nFileNum As Long Dim sOut As String nFileNum = FreeFile Open "TheNameOfYourFile.txt" For Output As #nFileNum For Each myRecord In Range("A1:A" & _ Range("A" & Rows.Count).End(xlUp).Row) With myRecord For Each myField In Range(.Cells(1), _ Cells(.Row, 256).End(xlToLeft)) 'I didn't want my Header Row touched but wanted it added into the csv file 'There's probably an easier way but this worked perfectly for me If myField.Text = "HEADER 1" Then sOut = sOut & QSTR & _ Replace(myField.Text, QSTR, QSTR & QSTR) & " " ElseIf myField.Text = "HEADER 2" Then sOut = sOut & QSTR & _ Replace(myField.Text, QSTR, QSTR & QSTR) & " " ElseIf myField.Text = "HEADER 3" Then sOut = sOut & QSTR & _ Replace(myField.Text, QSTR, QSTR & QSTR) & " " ElseIf myField.Text = "HEADER 4" Then sOut = sOut & QSTR & _ Replace(myField.Text, QSTR, QSTR & QSTR) & " " ElseIf myField.Text = "HEADER 5" Then sOut = sOut & QSTR & _ Replace(myField.Text, QSTR, QSTR & QSTR) & " " ElseIf myField.Text = "HEADER 6" Then sOut = sOut & QSTR & _ Replace(myField.Text, QSTR, QSTR & QSTR) & " " Else 'I didn't want my first column to start with "," so I added the code below If myField.Cells.Column = 1 Then sOut = sOut & QSTR & _ Replace(myField.Text, QSTR, QSTR & QSTR) & QSTR Else sOut = sOut & "," & QSTR & _ Replace(myField.Text, QSTR, QSTR & QSTR) & QSTR End If End If Next myField Print #nFileNum, Mid(sOut, 1) sOut = Empty End With Next myRecord Close #nFileNum End Sub 

此代码将删除额外的引用,并在数据的开头和结尾使用单引号保留数据。 我希望这有助于某人,如果我在格式上做错了或没有正确显示数据,请原谅我。 我只是想帮助别人。 请记住,这根本不是我的代码。 我让它为我工作,我怀疑其他人正在努力获得我在这里取得的成就。 原始代码可以在http://www.mcgimpsey.com/excel/textfiles.html#csvwithquotes找到