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



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



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




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



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




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




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




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

787   6  

6 ответов:

есть несколько библиотек. Вот два примера:


❐ Апач Викискладе Ланг

Apache Commons Lang включает в себя специальный класс для экранирования или 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 применяется к этим ситуациям.

сделать Java производить тот же результат.

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

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

[email protected]
Richard
"This is what I think"

преобразуется в это:

Email,Fname,Quoted  
[email protected],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-файле

Comments

    Ничего не найдено.