OpenCSV CSVWriter не добавляет символ кавычки для нулевого элемента

У меня есть требование, когда мне нужно обернуть все элементы символом кавычки.

Я использую CSVWriter для записи строк

CSVWriter writer = new CSVWriter(new FileWriter(rptFileName),`CSVWriter.DEFAULT_SEPARATOR, CSVWriter.DEFAULT_QUOTE_CHARACTER);

Когда элемент представляет собой пустую строку, он заключает в себя кавычку, а если он равен нулю, то он не добавляет символ кавычки.

поэтому вывод mu становится таким.

"ABC",,"","DEF"

что я хочу, как

"ABC","","","DEF"

Здесь 2-й элемент равен нулю, а 3-й элемент — пустая строка.

Есть ли способ в OpenCSV добиться этого без ручного вмешательства?


person Sushil Behera    schedule 22.06.2017    source источник


Ответы (3)


Я не думаю, что вы можете сделать это с CSVWriter в «автоматическом» режиме. Просто назначьте вручную пустое значение "" для null строк в вашем коде.

person Ivan Pronin    schedule 22.06.2017

Поскольку вы не хотите изменять каждую строку вручную, возможно, дайте univocity-parsers идти:

//configure writer
CsvWriterSettings settings = new CsvWriterSettings();
settings.setQuoteAllFields(true);

Если вы пишете строки (или списки строк):

//create writer with given config and output file
CsvWriter writer = new CsvWriter(new File(rptFileName), "UTF-8", settings);

//get your data from somewhere
List<Object[]> dataToWrite = getDataFromSomewhere();

//write everything.
writer.writeRowsAndClose(dataToWrite);

Если вы сбрасываете данные из ResultSet:

ResultSet rs = getDataFromSomewhere();
new CsvRoutines(settings).write(rs, new File(rptFileName), "UTF-8");

Это будет делать то, что вы хотите, без ручного изменения вашего ввода.

Раскрытие информации: я автор этой библиотеки, она бесплатная и с открытым исходным кодом (лицензия Apache 2.0)

person Jeronimo Backes    schedule 23.06.2017

Нет, CSVWriter был специально разработан таким образом, чтобы CSVReader мог различать, что является нулевым, а что является пустой строкой. Более поздние версии добавили CSVReaderNullFieldIndicator, чтобы пользователь мог решить, что является нулевым (если он был нулевым), но то же самое не было распространено на CSVWriter. Так что вам придется сделать некоторое ручное вмешательство, если вы хотите придерживаться openCSV.

Если ручное вмешательство невозможно, вы можете использовать библиотеки Apache Commons, чтобы помочь вам.

String[] copyArray = ArrayUtils.clone(originalValues);
for (int i = 0; i < copyArray.size; i++) {
   copyArray[i] = StringUtils.defaultString(copyArray[i]);
}

//  now use the CSVWriter to write the copyArray. 
person Scott Conway    schedule 29.06.2017