Метод apache-commons-csv println не печатает новую строку в выводе

Я новичок в 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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
1 795
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Не используйте метод новый формат, если вы не хотите переопределять разделители все.

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"

Большое спасибо за ответ. Теперь я понимаю, почему он не печатает новую строку. У меня есть две проблемы после того, как я внес изменения в код. Новый код: csvPrinter = новый CSVPrinter (новый FileWriter (выходной файл), CSVFormat.DEFAULT.withDelimiter (delimiter.charAt (0)). withHea‌​der (заголовок)); 1. Заголовок печатается в двойных кавычках. 2. В конце файла есть дополнительная пустая строка.

thatsarunb4u 10.04.2019 09:37

У меня такая же проблема, смена с разделителем записей не помогла. Для обходного решения я печатаю новую строку напрямую, например:

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();
        }

Другие вопросы по теме