Apache Commons CSV映射未找到。

9

我正在尝试使用Apache Commons CSV将包含指定标题的CSV文件读入Java对象。但是,当我运行代码时,我会收到以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: Mapping for Color not found, expected one of [Color, Name, Price, House Cost, Rent, 1 House, 2 Houses, 3 Houses, 4 Houses, Hotel, Mortgage]
at org.apache.commons.csv.CSVRecord.get(CSVRecord.java:102)
at GameBoard.<init>(GameBoard.java:25)
at Game.main(Game.java:3)

有人能解释一下这个异常是从哪里来的吗?在我看来,Apache Commons 似乎无法将我的输入与某个列匹配。是我的某个部分有问题还是其他地方出了错?以下是我的代码片段:
Reader in;
    Iterable<CSVRecord> records = null;
    try {
        in = new FileReader(new File(Objects.requireNonNull(getClass().getClassLoader().getResource("Properties.csv")).getFile()));
        records = CSVFormat.EXCEL.withFirstRecordAsHeader().parse(in);
    } catch (IOException | NullPointerException e) {
        e.printStackTrace();
        System.exit(1);
    }
    for (CSVRecord record :
            records) {
        spaces.add(new Property(
                record.get("Color"),
                record.get("Name"),
                Integer.parseInt(record.get("Price")),

以下是我的CSV文件头(抱歉,其中一个被截断了,但这不是重点):csv headers

谢谢!


我在想这是否与这个问题有关:https://stackoverflow.com/questions/10277348/how-does-get-work-on-hashmap 但如果是,我无法弄清如何解决它。 - Norman Percy
看起来像是一个奇怪的不匹配,它没有匹配到列表中的头部。也许CSV文件中有一些特殊字符或尾随空格,请展示一下CSV文件的文本内容,即CSV文件的内容。 - centic
4个回答

9

1
这应该被标记为已接受。请注意,在问题中,第一列也存在问题。 - RyanQuey

2
从2.4.5升级到2.6.7的Spring Boot版本导致了这个错误...在将csvRecord分配给我的POJO之前,我必须将每个csvRecord转换为一个map,如下所示。
for (CSVRecord csvRecord : csvRecords) {

            Map<String, String> csvMap = csvRecord.toMap();

            Model newModel = new Model();
           model.setSomething(csvMap.get("your_item"));
        }

0
我遇到了同样奇怪的异常。它实际上说“期望其中之一…”,然后列出了它无法找到的字段 - 就像在您的情况下一样。
原因是我设置了错误的CSV格式:
CSVFormat csvFormat = CSVFormat.newFormat(';');

这意味着我的代码试图在一个实际上使用逗号分隔符的文件中,将字段分隔为分号。一旦我使用了默认的CSV格式,一切都开始正常工作。
CSVFormat csvFormat = CSVFormat.DEFAULT;

所以答案可能是,您必须正确设置CSV格式以适应您的文件。

-1

enter image description here

我也遇到了同样的异常,因为在CSV文件的标题中给出了不同的名称,例如xyz,或者尝试通过调用csvRecord.get("x_z")来获取该值。

我解决了我的问题,改变了标题名称xyz

try {
  fileReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
  csvParser = new CSVParser(fileReader,
      CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());
  Iterable<CSVRecord> csvRecords = csvParser.getRecords();
  CSVFormat csvFormat = CSVFormat.DEFAULT;
  for (CSVRecord csvRecord : csvRecords) {


} catch (Exception e) {
  System.out.println("Reading CSV Error!");
  e.printStackTrace();
} finally {
  try {
    fileReader.close();
    csvParser.close();
  } catch (IOException e) {
    System.out.println("Closing fileReader/csvParser Error!");
    e.printStackTrace();
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接