Я новичок в apache-commons-csv 1.6.
У меня есть основное требование для печати CSV-файла с каждой записью в новой строке. Я пытаюсь использовать метод println CSVPrinter. По какой-то странной причине в выходном файле нет символа новой строки. Все печатается одной строкой.
Я попытался открыть вывод в Notepad++ и показать непечатаемые символы. Между записями нет символа. Любая помощь будет оценена по достоинству. Спасибо.
CSVPrinter csvPrinter = null;
if (delimiter != null && delimiter.length() > 0) {
csvPrinter = new CSVPrinter(new FileWriter(outputFile), CSVFormat.newFormat(delimiter.charAt(0)).withHeader(header));
}else {
csvPrinter = new CSVPrinter(new FileWriter(outputFile), CSVFormat.DEFAULT.withHeader(header));
}
for(Map<String,String> record : inputList) {
List<String> valueList = new ArrayList<String>();
for(String key : record.keySet()) {
valueList.add(record.get(key));
}
System.out.println(valueList);
csvPrinter.printRecord(valueList);
csvPrinter.println();
}
csvPrinter.close();
Ожидаемый результат:
идентификатор|тип|значение|ключ
4|excel|0|excel.лист.нет
5|excel|дд/мм/гггг|excel.date.format
6|excel|0|excel.baserate.rownum
Фактический результат: идентификатор|тип|значение|key4|excel|0|excel.sheet.no5|excel|дд/мм/гггг|excel.date.format6|excel|0|excel.baserate.rownum
Не используйте метод новый формат, если вы не хотите переопределять разделители все.
Use this method if you want to create a CSVFormat from scratch. All fields but the delimiter will be initialized with null/false.
Если вы хотите добавить новый разделитель строк для каждой записи, добавьте с разделителем записей
CSVFormat.newFormat(delimiter.charAt(0)).withHeader(header)).
withRecordSeparator(System.getProperty("line.separator"));
Returns a new CSVFormat with the record separator of the format set to the specified character.
Note: This setting is only used during printing and does not affect parsing. Parsing currently only works for inputs with '\n', '\r' and "\r\n"
У меня такая же проблема, смена с разделителем записей не помогла. Для обходного решения я печатаю новую строку напрямую, например:
private static final char DELIMITER_CHAR = ',';
try (CSVParser parser = CSVFormat.newFormat(DELIMITER_CHAR).withTrailingDelimiter(false)
.withRecordSeparator('\n').parse(new InputStreamReader(new ByteArrayInputStream(bytes)));
CSVPrinter printer = CSVFormat.newFormat(DELIMITER_CHAR).print(destinationFile, Charset.defaultCharset())) {
for (CSVRecord record : parser) {
try {
printer.printRecord(record);
// printer.println(); // TODO not working
printer.print('\n'); // work around solution
} catch (Exception e) {
throw new RuntimeException("Error at line " + parser.getCurrentLineNumber(), e);
}
}
printer.flush();
}
Большое спасибо за ответ. Теперь я понимаю, почему он не печатает новую строку. У меня есть две проблемы после того, как я внес изменения в код. Новый код: csvPrinter = новый CSVPrinter (новый FileWriter (выходной файл), CSVFormat.DEFAULT.withDelimiter (delimiter.charAt (0)). withHeader (заголовок)); 1. Заголовок печатается в двойных кавычках. 2. В конце файла есть дополнительная пустая строка.