Как избежать запятой и двойной кавычки одновременно для 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-файле