Использование CSVWriter для записи массива строк - некоторые с кавычками, а некоторые без
Я вижу еще несколько вопросов о записи CSVWriter в файлы и цитатах. Но ничего более конкретного, чем моя проблема.
Я хочу напечатать что-то вроде:
abc,def,ghi,"jkl",mno,pqr
Когда я просто пишу:
CSVWriter writer = new CSVWriter(new FileWriter(getFullPathToTestFile(), true));
String[] newLine = { "abc","def","ghi","jkl","mno","pqr" };
writer.writeNext(newLine);
что распечатывается:
«abc», «def», «ghi», «jkl», «mno», «pqr»
Итак, я попробовал:
CSVWriter writer = new CSVWriter(new FileWriter(getFullPathToTestFile(), true), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
String[] newLine = { "abc","def","ghi","jkl","mno","pqr" };
writer.writeNext(newLine);
что дает мне:
abc, def, ghi, jkl, mno, pqr
Но мне нужны цитаты на jkl. Итак, я попробовал что-то вроде:
CSVWriter writer = new CSVWriter(new FileWriter(getFullPathToTestFile(), true), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
String[] newLine = { "abc","def","ghi","\""+"jkl"+"\"","mno","pqr" };
writer.writeNext(newLine);
что удивительно дает мне:
abc, def, ghi, "jkl" ", mno, pqr
У меня нет идей на данный момент. Может ли кто-нибудь помочь мне понять это, и мы будем очень признательны за любые советы по тому, как заставить это работать.
1 ответ
Во-первых: я предполагаю, что вы используете com.opencsv.CSVWriter, и я имею в виду документацию по адресу http://opencsv.sourceforge.net/apidocs/com/opencsv/CSVWriter.html
Синтаксис в вашем примере массива неверен. abc,def,.. будут переменными, если вы их не цитируете, поэтому, вероятно, следует читать
String[] newLine = { "abc","def","ghi","\"jkl\"","mno","pqr" };
Кроме того, из документов я вижу
CSVWriter(Writer writer, char separator, char quotechar, char escapechar, String lineEnd)
но в вашем коде вы используете только параметры separator и quotechar, вы не указываете escapechar или lineEnd. Я предполагаю, что они будут установлены по умолчанию в вашей версии библиотеки.
Таким образом, вы указываете csvWriter использовать «запятую» в качестве разделителя между значениями и явно не использовать кавычки, а избегать и использовать окончание строки по умолчанию. Когда csvWriter встречает цитату в вашем "jkl", он пытается избежать этого с помощью механизма по умолчанию (удваивая кавычки).
Вы можете попробовать добавить кавычки в свой источник и отключить экранирование
CSVWriter writer = new CSVWriter(new FileWriter(getFullPathToTestFile(), true), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);
В зависимости от вашего варианта использования этого может быть достаточно, но он не работает, например, если у вас есть запятая в любом из значений.
В качестве альтернативы вы можете написать свою собственную реализацию Writer, которая принимает выходные данные CSVWriter и применяет регулярное выражение для добавления кавычек в N-й столбец.
CSVWriter writer = new CSVWriter(new RegexpReplaceWriter(new FileWriter(getFullPathToTestFile(), true)), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);