Использование 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);
Другие вопросы по тегам