【问题标题】:Problems while parsing a CSV file in Java在 Java 中解析 CSV 文件时出现问题
【发布时间】:2016-02-29 12:36:43
【问题描述】:

在此代码中,目的是解析 CSV 文件并将其数据映射到 bean 对象。

ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(Country.class);
String[] columns = new String[] {"countryName", "capital"};
strat.setColumnMapping(columns);

CsvToBean csv = new CsvToBean();

String csvFilename = "C:/Users/user/Desktop/sample.csv";
CSVReader csvReader = new CSVReader(new FileReader(csvFilename));

文件中的列在原始数据下方有一个标题,有时还有附加信息(如字符串或整数单元格中的数字或单词)。

我在之前的问题中询问了如何忽略此附加信息,并得到此代码作为答案:

List<Country> list = new ArrayList<Country>();
String [] row = csvReader.readNext(); //skip header
    if(row == null) throw new RuntimeException("File is empty");
    row = csvReader.readNext();
    String [] nextRow = csvReader.readNext();
    while(row != null) {
       if(nextRow == null) break; //check what 'row' is last
       if("Total:".equalsIgnoreCase(row[1])) break; //check column for special strings

       list.add(csv.processLine(strat, row)); <----

       row = nextRow;
       nextRow = csvReader.readNext();

当我尝试实现此代码时,我在箭头标记的行出现了两个错误。

线程“主”java.lang.Error 中的异常:未解决的编译 问题:

类型List中的add(Country)方法不是 适用于参数(对象)

CsvToBean 类型的方法 processLine(MappingStrategy, String[]) 不可见

有人知道如何解决这个问题吗?我对 Java 还很陌生。

非常感谢。

【问题讨论】:

  • processLine 返回什么?
  • processLine 方法需要返回一个 Country。如果该行返回一个国家信息字符串,则创建国家:add(new Country(processLine(strat, row));
  • 您的 CSVToBean 需要获取参数。您需要创建:CsvToBean csv = new CsvToBean()。这样 bean 就知道通用返回类型。
  • 谢谢它解决了第一个问题!但第二个仍然存在

标签: java parsing csv opencsv


【解决方案1】:

方法 processLine(MappingStrategy, String[]) 来自类型 CsvToBean 不可见

表示此方法必须是可访问的(可能原因;它是私有的、受保护的或友好的),所以使用公共

List 类型中的 add(Country) 方法不适用于 参数(对象)

并且必须返回类型国家,方法签名必须是这样的;

public Country processLine(ColumnPositionMappingStrategy strat, String [] row)

【讨论】:

    【解决方案2】:

    一种解决方案应该将 processLine 的响应向下转换为 Country,如下所示:

    list.add(csv.processLine(strat, row));

    list.add((Country) csv.processLine(strat, row));

    但是关于方法可见性的第二个问题清楚地表明您没有使用库的公共 API。
    请阅读该库的文档和示例,了解如何使用它。

    【讨论】:

      【解决方案3】:

      使用我在your previous post 中指出的CSVToBeanFilter,它应该可以解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多