java - хитрости - фишки excel



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

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, используя код 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"

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


Answer #1

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

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

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

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

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

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

P Sherman, 42 Wallaby Way,
Sydney, AUSTRALIA

Принимая во внимание, что, если это было процитировано правильно, это было бы очевидно, то есть

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

К вашему сведению, вот правила, относящиеся к цитатам из 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"

Answer #2

У меня была ситуация, когда я сталкивался с данными, отображаемыми в моем файле .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


Answer #3

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

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

Посмотреть CSVWriter Javadoc





supercsv