【问题标题】:Apache Commons CSV : Read Values with commaApache Commons CSV:用逗号读取值
【发布时间】:2016-03-21 11:16:51
【问题描述】:

我正在将 CSV 文件转换为 Java Bean。我需要将逗号保留在 "" 中的值内。

这是我的代码。

public static PPRCV convertContestToObj(String fileName) throws IOException {

    PPRCV pprcvHandler = PPRCVFactory.getPPRCVTable(fileName);

    CSVFormat csvFileFormat = CSVFormat.DEFAULT.newFormat(',').withEscape('"');

    List<PPRCV> pprcvs = new ArrayList<>();
    FileReader fileReader = new FileReader(fileName);

    CSVParser csvFileParser = new CSVParser(fileReader, csvFileFormat);

    List<CSVRecord> csvRecords = csvFileParser.getRecords();

    for (CSVRecord csvRecord : csvRecords) {
        pprcvs.add(pprcvHandler.populateDynamicDetails(csvRecord));
    }

    return pprcvHandler;

}

CSV 行示例:

7080001, XI, ProvinceX, TownX, BRGX, "SHOOL, BRGX", "0054A,0055A,0055B,0055C"

我的 DTO

private String precintCode;

private String regionName;

private String provinceName;

private String municipalityName;

private String districtName;

private String votingCenter;

private String precint;

我的预期输出应该是

区域代码 = "7080001"

regionName = "XI"

provinceName = "ProvinceX"

municipalityName = "TownX"

区名 = "BRGX"

votingCenter = "学校,BRGX"

区域 = "0054A,0055A,0055B,0055C"

但是实际输出是这样的

区域代码 = "7080001"

regionName = "XI"

provinceName = "ProvinceX"

municipalityName = "TownX"

区名 = "BRGX"

votingCenter = ""学校"

区域 = " , BRGX,"0054A"

【问题讨论】:

  • 您是否考虑过将实现切换到 OpenCSV?与 Apache Commons opencsv.sourceforge.net 的 CSV 支持相比,它具有更丰富的 API

标签: java csv opencsv


【解决方案1】:

您需要withIgnoreSurroundingSpaces() 选项。所有其他设置可以保持DEFAULT

    final Reader in = new StringReader("7080001, XI, ProvinceX, TownX, BRGX, \"SHOOL, BRGX\", \"0054A,0055A,0055B,0055C\" ");
    final CSVFormat csvFileFormat = CSVFormat.DEFAULT.withIgnoreSurroundingSpaces();

    for (CSVRecord record: csvFileFormat.parse(in)) {
        for (String field: record) {
            System.out.println("\"" + field + "\"");
        }
        System.out.println();
    }

输出是

"7080001"
"XI"
"ProvinceX"
"TownX"
"BRGX"
"SHOOL, BRGX"
"0054A,0055A,0055B,0055C"

【讨论】:

  • 我需要类似的东西.. 但是如果我使用它,我会在封装的令牌和分隔符之间收到错误无效字符,如果我使用 WithQuote(null) 就会消失.. 但是它需要逗号在引号内读取值
  • 我印象深刻的是,这种方法命名是多么没有意义以及它的工作原理是多么流畅
【解决方案2】:

我可以使用库中的 withQuote 函数来做到这一点。

CSVFormat.EXCEL.newFormat(',').withQuote('"')

【讨论】:

  • 至少在 commons-csv 1,5 上,newFormat() 是静态的,所以您的示例实际上与 CSVFormat.newFormat(',').withQuote('"') 相同
【解决方案3】:

您是否已经尝试过使用CSVFormat.DEFAULT constant?--它适用于遵循RFC 4180 的CSV 文件。

【讨论】:

    【解决方案4】:

    以下方法对我有用:

    CSVFormat.EXCEL.withQuote('"')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 2017-06-26
      • 2018-04-22
      • 1970-01-01
      相关资源
      最近更新 更多