Ответ 1
Это сработало для меня
CSVWriter writer =
new CSVWriter(new FileWriter(csv), ',', CSVWriter.NO_QUOTE_CHARACTER);
Я создал файл 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, но содержимое файла содержит нежелательные двойные кавычки.
Eg. "ABC", "123", "KDNJ"
Я не получаю, откуда эти двойные кавычки добавляются.
Это сработало для меня
CSVWriter writer =
new CSVWriter(new FileWriter(csv), ',', CSVWriter.NO_QUOTE_CHARACTER);
Вероятно, вы должны уточнить, что вы подразумеваете под "нежелательными" цитатами.
Я не хочу, чтобы он цитировал все, только поля, которые содержат встроенные запятые, цитаты и новые строки (цитирование всего не нужно и делает мои файлы больше), или
Я не хочу ничего цитировать, и я понимаю, что мой CSV будет недействительным, если он содержит встроенные запятые, кавычки и символы новой строки
Если это первый вариант, то opencsv не поддерживает это - он либо цитирует все, либо ничего. Взгляните на Super CSV, если вы хотите использовать CSV-библиотеку с открытым исходным кодом, которая при необходимости цитируется (и может цитата все тоже, если это необходимо).
Если это второй вариант, перейдите к ответам Шелдона, но просто знайте, что ваш CSV будет недействительным, если он содержит встроенные запятые, кавычки и символы новой строки.
Например, если я читаю ваш CSV файл, как я должен знать, что на самом деле это всего лишь одна запись с двумя полями?
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"
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 (файлAbsolutePath, csvLinesList);
Рабочий пример для ответа Шамиса. Он отлично работает для меня.
public static void main(String[] args)
{
try
{
String file = "D:/testdata.csv";
BufferedReader br = new BufferedReader( new FileReader(file));
String line;
int cnt =1;
while( (line = br.readLine()) != null )
{
if(cnt > 1)
{
System.out.println(line);
}
cnt++;
}
}
catch(Exception e)
{
System.out.println("Exception while reading csv file: " + e);
}
}
Я также сталкиваюсь с той же проблемой с открытым csv, и для исправления проблемы я использую экранированный символ.
для ex:
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" | "Нет" | 2012 | 1668.88
Здесь "Rubasingha" открывает и закрывает двойные кавычки, а в "Нет" также открываются и закрываются одинарные кавычки. эти две функции отлично работают по умолчанию csv
но когда мы используем 'Abc - открываем только одинарные кавычки - это также отлично работает
но MATARA ИЛИ "MATARA - здесь у нас есть одна двойная кавычка - в моем случае это порождает ошибку при чтении 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');
И если вы просто процитировали ваши экранированные символы, а не двойные кавычки, вы можете использовать три конструктора 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), '|','^');
Так я исправляю проблему. Благодаря