Нежелательные двойные кавычки в сгенерированном csv-файле

Я создал файл CSV, используя код Java ниже:

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"

Я не понимаю, откуда эти двойные кавычки добавляются.

6 ответов


это сработало для меня

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

посмотреть CSVWriter javadoc


вы, вероятно, должны уточнить, что вы подразумеваете под "нежелательными" цитатами.

  1. Я не хочу его цитировать все, только поля, которые содержат встроенные запятые, кавычки и новые строки (цитирование всего ненужно и делает мои файлы больше), или

  2. Я не хочу ничего цитировать, и я понимаю, что мой CSV будет недействительным, если он содержит встроенные запятые, кавычки и новые строки

если это первый вариант, затем opencsv не поддерживает это - он либо цитирует все, либо ничего. Взгляните на супер CSV если вы хотите библиотеку CSV с открытым исходным кодом, которая цитирует только при необходимости (и может цитата все тоже, если требуется).

если это второй вариант, перейдите к ответу Шелдона, но просто имейте в виду, что ваш CSV будет недействительным, если он содержит встроенные запятые, кавычки и новые строки.

например, если я читаю ваш CSV-файл, как я должен знать, что на самом деле это всего лишь одна запись с 2 полями?

P Sherman, 42 Wallaby Way,
Sydney, AUSTRALIA

тогда как если бы он был процитирован правильно, это было бы очевидно, т. е.

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

FYI, вот правила, касающиеся цитат из RFC4180 (определение типа MIME для CSV).

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);

рабочий пример для ответа Шамиса, он отлично работает для меня.


Я также сталкиваюсь с той же проблемой с открытым 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" открыть и закрыть двойные кавычки и в "нет" также открывать и закрывать одинарные кавычки. эти два отлично работают по умолчанию open csv

но когда мы используем 'Abc - только открытые одинарные кавычки-это также отлично работает

но Матара" или "Матара - здесь у нас есть одна двойная цитата - в моем случае это генерирует ошибку при чтении CSV с помощью open csv

для исправления проблемы я ссылаюсь на эту страницу (http://cs.swan.ac.uk/~csbob/teaching/java/JavaDemoNetbeans/opencsv-2.3/doc/)

конструкторы которые поставляют еду для поставлять ваши собственные характеры разделителя и цитаты. Скажем, вы используете вкладку для своего разделителя, вы можете сделать что-то вроде этого:

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

и если вы одинарно процитировали свои экранированные символы, а не дважды процитировали их, вы можете использовать конструктор three arg:

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

вы также можете пропустить первые несколько строк файл, если вы знаете, что содержимое не запускается до конца в файле. Так, например, вы можете пропустить первые две строки, выполнив:

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

поэтому я меняю мой escape-символ по умолчанию на ( ^ ) знак без использования двойных кавычек в качестве escape-символа.

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