Вопрос по excel, java, regex – Как избежать запятой и двойной кавычки одновременно для файла CSV?

60

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

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

ID FN LN AGE COMMENT

123, John, Smith, 39, I said "Hey, I am 5'10"."

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

I said "Hey, I am 5'10"."

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

Я уверен, что Oracle (и остальные основные СУБД) имеют «экспорт». функция, которая выполняет эту функцию. За исключением этого, вероятно, существует версия с открытым исходным кодом, которая будет взаимодействовать практически с чем угодно через JDBC, учитывая, насколько распространен этот тип функциональности. Clockwork-Muse
Спасибо X-Zero, но здесь работа фактически зависит от контроллера. Но все равно очень полезная идея :) Dreamer
Для Свифта,github.com/Daniel1of1/CSwiftV это rfc4180 Fattie

Ваш Ответ

6   ответов
3

Python пишет Excel-совместимыйcsv files.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Dreamer
Error: User Rate Limit Exceeded
34

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

Заставьте Java произвести тот же вывод.

Форматы, используемые Excel опубликованы, кстати ...

**** Редактировать 1: **** Вот что делает Excel
**** Редактировать 2: **** Обратите внимание, что php 'sfputcsv делает то же самое, что и Excel, если вы используете & quot; как вложение.

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

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

Email,Fname,Quoted  
[email protected],Richard,"""This is what I think"""
Error: User Rate Limit Exceeded"""" ?
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Dreamer
Error: User Rate Limit Exceeded
97

❐ Apache Commons Lang

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

Escape to 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 from 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"."

* You can download it from Вот.

❐ OpenCSV

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

Writing file:

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

Reading file:

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

* You can download it from Вот.

Error: User Rate Limit Exceeded Dreamer
FixedError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Dreamer
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededissues.apache.org/jira/browse/LANG-857Error: User Rate Limit Exceeded
13

и Полу за быструю обратную связь, это очень полезно. Я на самом деле найти решение через 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+"\"" )

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

поэтому двойная кавычка используется для экранирования

Important Note

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

даст вам другой результат, потому что после запятой есть пробел, который будет рассматриваться как & quot;

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

Error: User Rate Limit Exceeded

Похожие вопросы