Как избежать запятой и двойной кавычки одновременно для CSV-файла?
Я пишу Java-приложение для экспорта данных из Oracle в csv-файл
к сожалению, содержание данных может быть довольно сложно. Все еще запятая является разделителем, но некоторые данные в строке могут быть такими:
IDFN LNвозрасткомментарий
123, Джон, Смит, 39, я сказал: "Эй, я 5'10"."
так это одна из строк на comment колонка:
Я сказал: "Эй, я 5'10"."
не шучу, мне нужно показать выше комментарий без компромиссов в excel или open office из CSV-файла, сгенерированного Java, и, конечно же, не может испортить другую регулярную экранирующую ситуацию(т. е. регулярные двойные кавычки и регулярная запятая в кортеже). Я знаю, что регулярное выражение является мощным, но как мы можем достичь цели с такой сложной ситуацией?
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: * * * * Обратите внимание, что phpfputcsvделает то же самое, как 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