apache-commons-csv println方法在输出中不打印换行符

时间:2019-04-10 06:42:03

标签: java newline apache-commons-csv

我是apache-commons-csv 1.6的新手

我有一个基本要求,以每行新记录打印csv文件。我正在尝试使用CSVPrinter的println方法。由于某些奇怪的原因,输出文件没有任何换行符。一切都打印在一行中。

我试图在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();

预期结果:

id | type | value | key

4 | excel | 0 | excel.sheet.no

5 | excel | dd / MM / yyyy | excel.date.format

6 | excel | 0 | excel.baserate.rownum

实际结果: id | type | value | key4 | excel | 0 | excel.sheet.no5 | excel | dd / MM / yyyy | excel.date.format6 | excel | 0 | excel.baserate.rownum

2 个答案:

答案 0 :(得分:1)

我遇到同样的问题,更改 withRecordSeparator 并没有帮助。对于解决方法,我直接打印新行,例如:

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

答案 1 :(得分:0)

如果您不想覆盖所有定界符

,请不要使用newFormat方法
  

如果要从头开始创建CSVFormat,请使用此方法。除定界符外的所有字段都将初始化为null / false。

如果您想为每条记录添加新的行定界符,请添加withRecordSeparator

CSVFormat.newFormat(delimiter.charAt(0)).withHeader(header)).
 withRecordSeparator(System.getProperty("line.separator"));
  

返回一个新的CSVFormat,其格式的记录分隔符设置为指定字符。

     

注意:此设置仅在打印期间使用,不会影响解析。当前,解析仅适用于具有'\ n','\ r'和“ \ r \ n”的输入