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

时间:2012-12-20 09:46:30

标签: 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();

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

  

EG。 “ABC”, “123”, “KDNJ”

我不知道这些双引号的添加位置。

8 个答案:

答案 0 :(得分:44)

这对我有用

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

请参阅CSVWriter javadoc

答案 1 :(得分:12)

您应该澄清“不受欢迎的”引号的含义。

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

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

  3. 如果这是第一个选项,那么opencsv不支持这个 - 它要么引用一切,要么什么都不引用。如果您想要一个仅在必要时引用的开源CSV库(如果需要,可以Super CSV),请查看quote everything too

    如果这是第二个选项,那么请使用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"
    

答案 2 :(得分:4)

如果您不想在生成的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。您可以自定义其他构造函数参数的值。

答案 3 :(得分:1)

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回答的工作示例,对我来说很好。

答案 4 :(得分:0)

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

代表:

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

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

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

A2 | G A A | Thilina | 9022V | 1 | 2 | 3 | 4 |“Rubasingha”|'Abc | MATARA“|'No'| 2012 | 1668.88

在这里“Rubasingha”打开并关闭双引号,在'否'中也打开并关闭单引号。这两个在默认打开csv

中完美地工作

但是当我们使用'Abc 时 - 只打开单引号 - 这也可以正常使用

MATARA“”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), '|','^');

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

答案 5 :(得分:0)

我遇到的一种情况是我面对的是显示在.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

中找到

答案 6 :(得分:0)

我遇到了同样的问题,但是当我为开放式csv库5.3版实施解决方案后,仍然发现了一些问题。

它将所需的数据转换为包含默认转义字符的csv文件。因此,要正确完成实现,我需要取消转义字符。因此,如果由于出现转义字符而在Libre office或Microsoft excel中打开文件时仍然遇到问题,请使用以下解决方案:

new CSVWriter(new FileWriter(path),
            CSVWriter.DEFAULT_SEPARATOR,
            CSVWriter.NO_QUOTE_CHARACTER,
            CSVWriter.NO_ESCAPE_CHARACTER,
            CSVWriter.DEFAULT_LINE_END    
        );

答案 7 :(得分:0)

在 5.4 版的 opencsv 上解决了我同样的问题:

CSVWriter writer = new CSVWriter(new FileWriter(file), ',',
                                             CSVWriter.NO_QUOTE_CHARACTER,
                                             CSVWriter.DEFAULT_ESCAPE_CHARACTER,
                                             CSVWriter.DEFAULT_LINE_END);