Нежелательные двойные кавычки в сгенерированном файле 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, но содержимое файла содержит нежелательные двойные кавычки.

Eg. "ABC", "123", "KDNJ"

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

Ответы

Ответ 1

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

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

См. javadoc CSVWriter

Ответ 2

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

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

  • Я не хочу ничего цитировать, и я понимаю, что мой 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"

Ответ 3

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

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

Ответ 4

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

Ответ 5

Я также сталкиваюсь с той же проблемой с открытым 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), '|','^');

Так я исправляю проблему. Благодаря