Как избежать запятой и двойной кавычки одновременно для CSV-файла?

Я пишу Java-приложение для экспорта данных из Oracle в csv-файл

к сожалению, содержание данных может быть довольно сложно. Еще запятая deliminator, но некоторые данные по строке может быть такой:

ID FN LN возраст комментарий

123, Джон, Смит, 39, я сказал: "Эй, я 5'10"."

так это одна из строк на comment колонка:

Я сказал: "Эй, я 5'10"."

без шуток, мне нужно показать выше комментарий без компромиссов в excel или open office из CSV-файла, сгенерированного Java, и, конечно же, не может испортить другую регулярную экранирующую ситуацию(т. е. регулярные двойные кавычки и регулярные запятые в кортеже). Я знаю, что регулярное выражение является мощным, но как мы можем достичь цели с такой сложной ситуацией?

6 ответов


существует несколько библиотек. Вот два примера:--6-->


Apache Apache Commons Lang

Apache Commons Lang включает специальный класс для escape или unescape строк (CSV, EcmaScript, HTML, Java, Json, XML):org.apache.commons.lang3.StringEscapeUtils.

  • побег в CSV

    String escaped = StringEscapeUtils
        .escapeCsv("I said \"Hey, I am 5'10\".\""); // I said "Hey, I am 5'10"."
    
    System.out.println(escaped); // "I said ""Hey, I am 5'10""."""
    
  • Unescape от CSV

    String unescaped = StringEscapeUtils
        .unescapeCsv("\"I said \"\"Hey, I am 5'10\"\".\"\"\""); // "I said ""Hey, I am 5'10""."""
    
    System.out.println(unescaped); // I said "Hey, I am 5'10"."
    

* вы можете скачать его с здесь.


OpenCSV❐

если вы используете OpenCSV, вам не нужно будет беспокоиться о побеге или unescape, только для записи или чтения содержимого.

  • запись в файл:

    FileOutputStream fos = new FileOutputStream("awesomefile.csv"); 
    OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
    CSVWriter writer = new CSVWriter(osw);
    ...
    String[] row = {
        "123", 
        "John", 
        "Smith", 
        "39", 
        "I said \"Hey, I am 5'10\".\""
    };
    writer.writeNext(row);
    ...
    writer.close();
    osw.close();
    os.close();
    
  • чтение файл:

    FileInputStream fis = new FileInputStream("awesomefile.csv"); 
    InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
    CSVReader reader = new CSVReader(isr);
    
    for (String[] row; (row = reader.readNext()) != null;) {
        System.out.println(Arrays.toString(row));
    }
    
    reader.close();
    isr.close();
    fis.close();
    

* вы можете скачать его с здесь.


Excel должен иметь возможность обрабатывать ту же самую ситуацию.

поместите эти вещи в Excel, сохраните их как CSV и изучите файл с помощью текстового редактора. Тогда вы будете знать, что правила Excel применяется к этим ситуациям.

Make Java производит тот же вывод.

форматы, используемые Excel публикуются, кстати...

****Edit 1: * * * * Вот что делает Excel
**** Edit 2: * * * * Обратите внимание, что php fputcsv делает то же самое, как excel, если вы используете " в качестве приложения.

rdeslonde@mydomain.com
Richard
"This is what I think"

превращается в это:

Email,Fname,Quoted  
rdeslonde@mydomain.com,Richard,"""This is what I think"""

спасибо и Тони и полу за быструю обратную связь, его очень полезно. Я на самом деле нашел решение через POJO. Вот это:

if (cell_value.indexOf("\"") != -1 || cell_value.indexOf(",") != -1) {
    cell_value = cell_value.replaceAll("\"", "\"\"");
    row.append("\"");
    row.append(cell_value);
    row.append("\"");
} else {
    row.append(cell_value);
}

просто говоря, если есть специальный символ, такой как запятая или двойная кавычка в строке сбоку ячейки, то сначала избежать двойной кавычки ("\""), добавив дополнительную двойную кавычку (например,"\"\""), затем поместите все это в двойную кавычку (например,"\""+theWholeThing+"\"" )


вы также можете посмотреть, как Python пишет Excel-совместимый csv файлы.

Я считаю, что по умолчанию для Excel является удвоение буквенных символов цитаты-то есть буквальные кавычки " пишутся как "".


"cell one","cell "" two","cell "" ,three"

сохранить это в csv-файл и посмотреть результаты, так что двойная цитата используется, чтобы избежать себя

Важное Замечание

"cell one","cell "" two", "cell "" ,three"

даст вам другой результат, потому что есть пробел после запятой, и это будет рассматриваться как "


String stringWithQuates = "\""+ "your,comma,separated,string" + "\"";

это сохранит запятую в CSV-файле