Нежелательные двойные кавычки в сгенерированном 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
вы, вероятно, должны уточнить, что вы подразумеваете под "нежелательными" цитатами.
Я не хочу его цитировать все, только поля, которые содержат встроенные запятые, кавычки и новые строки (цитирование всего ненужно и делает мои файлы больше), или
Я не хочу ничего цитировать, и я понимаю, что мой 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