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

nsc4cvqm  于 2023-03-11  发布在  Java
关注(0)|答案(3)|浏览(172)

我是apache-commons-csv 1.6的新手
我有一个基本的要求,打印csv文件的每一个记录在新的一行。我试图使用CSVPrinter的println方法。由于一些奇怪的原因,输出文件没有任何换行符。一切都打印在一个单行。
我已经尝试在记事本++中打开输出并显示不可打印的字符。记录之间没有字符。任何帮助将不胜感激。谢谢。

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|胜过|0|excel.sheet.no
5|胜过|日/月/年|excel.date.format
6|胜过|0|excel.baserate.rownum
实际结果:身份证|类型|价值|按键4|胜过|0|excel.sheet.no5|胜过|日/月/年|excel.date.format6|胜过|0|excel.baserate.rownum

pkmbmrz7

pkmbmrz71#

如果不想覆盖所有分隔符,请不要使用newFormat方法
如果要从头创建CSVFormat,请使用此方法。除分隔符外的所有字段都将初始化为null/false。
如果要为每条记录添加新的行分隔符,请添加RecordSeparator

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

返回一个新的CSVFormat,格式的记录分隔符设置为指定字符。
注意:此设置仅在打印过程中使用,不影响分析。分析当前仅适用于具有“\n”、“\r”和“\r\n”的输入

pxyaymoc

pxyaymoc2#

我遇到了同样的问题,使用RecordSeparator*更改没有帮助。作为变通方案,我直接打印新行,如下所示:

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

ttp71kqs3#

更新https://stackoverflow.com/a/55606621/373498的主要答案
由于不推荐使用withRecordSeparator,因此应使用.setRecordSeparator(System.getProperty("line.separator"))定义换行符。
示例:

final CSVFormat csvFormat = CSVFormat.Builder
            .create()
            .setHeader(csvHeaders)
            .setDelimiter(";")
            .setQuoteMode(QuoteMode.ALL)
            .setRecordSeparator("\n") // unix line feed
            .setAutoFlush(true)
            .setEscape('"')
            .build();

 final StringWriter stringWriter = new StringWriter();
 try (CSVPrinter csvPrinter = new CSVPrinter(stringWriter, csvFormat)) {
:

相关问题