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

Java 生成的csv文件中不需要的双引号,java,csv,file-io,opencsv,supercsv,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.

我使用以下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);

请参阅

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

  • 我不希望它引用所有内容,只引用包含 嵌入逗号、引号和换行符(引用所有内容是不必要的,并且 使我的文件更大),或

  • 我不想引用任何东西,我知道如果我的CSV包含嵌入的逗号、引号和换行符,它将无效

  • 如果它是第一个选项,那么opencsv不支持它——它要么引用所有内容,要么什么都不引用。看看您是否想要一个只在必要时引用的开源CSV库(如果需要,还可以引用)

    如果是第二个选项,那么按照Sheldon的回答,但要注意,如果CSV包含嵌入的逗号、引号和换行符,则CSV将无效

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

    P Sherman, 42 Wallaby Way,
    Sydney, AUSTRALIA
    
    然而,如果它被正确引用,这将是显而易见的,即

    P Sherman, "42 Wallaby Way,
    Sydney, AUSTRALIA"
    
    仅供参考,以下是有关引用的规则(CSV的MIME类型定义)

    5每个字段可以用双引号括起来,也可以不用双引号括起来(但是 有些程序,如Microsoft Excel,不使用双引号 完全没有)。如果字段没有用双引号括起来,则 双引号不能出现在字段内。例如:

       "aaa","bbb","ccc" CRLF
       zzz,yyy,xxx
    
       "aaa","b CRLF
       bb","ccc" CRLF
       zzz,yyy,xxx
    
       "aaa","b""bb","ccc"
    
    6包含换行符(CRLF)、双引号和逗号的字段 应该用双引号括起来。例如:

       "aaa","bbb","ccc" CRLF
       zzz,yyy,xxx
    
       "aaa","b CRLF
       bb","ccc" CRLF
       zzz,yyy,xxx
    
       "aaa","b""bb","ccc"
    
    7如果使用双引号括起字段,则使用双引号 出现在字段中时,必须在其前面加上 另一个双引号。例如:

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

    我在打开csv时也面临同样的问题,为了解决这个问题,我使用了转义字符

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

    CSVReader csvReader = new CSVReader(new FileReader(fileName), seprator,escaped_character);
    
    在这里打开csv默认使用双引号作为转义字符(据我所知)

    在我的例子中,我使用分隔符作为管道标志(|)

    A2 | G A | Thilina | 9022V | 1 | 2 | 3 | 4 |“鲁巴辛哈”|“Abc | MATARA”|“否”| 2012 | 1668.88

    在这里,“Rubasingha”打开和关闭双引号,在“否”中也打开和关闭单引号。这两个功能在默认的open csv中非常有效

    但是当我们使用Abc时——只打开单引号——这也很好

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

    要解决此问题,请参阅本页()

    有些构造函数可以提供您自己的分隔符和引号字符。如果您使用分隔符选项卡,可以执行以下操作:

    CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t');
    
    如果对转义字符单引号而不是双引号,则可以使用三个参数构造函数:

    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), '|','^');
    
    这就是我解决问题的方法。感谢私有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文件的值中使用引号,则必须以以下方式创建CSVWriter对象:

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

    关键是
    CSVWriter。没有字符。
    。您可以自定义其他构造函数参数的值。

    我遇到过这样一种情况:我的.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
    
    此代码将删除多余的引号,并在数据的开头和结尾只保留单引号。我希望这对某人有所帮助。如果我的格式有误或数据显示不正确,请原谅。我只是想帮助其他人。请记住,这根本不是我的代码。我只是让它正常工作对我来说,我怀疑其他人正试图获得我在这里取得的成就。
    原始代码可以在这里找到

    我也遇到了同样的问题,并且在我实现了开放式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    
            );
    

    在版本为5.4的opencsv上,修复了相同的问题:

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

    您知道CSV通常具有文本识别字符(在您的案例中为双引号)。这可能是CSVWriter的默认设置,您可能可以更改。问题的原因是什么?生成的CSV应该由使用这些设置的任何软件正确打开。+1用于超级SV链接。我正试图完全按照您在回答中场景1中描述的做。超级SV做得很好。我已确认它可以处理我的most常见问题字符(读写):逗号、单引号/撇号、双引号。感谢您的推荐!关于