找不到Apache Commons CSV映射

时间:2018-12-06 01:15:01

标签: java csv apache-commons apache-commons-csv

我正在尝试使用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

谢谢!

3 个答案:

答案 0 :(得分:2)

我有同样的问题,仅当您引用第一列时,所有其他列名都在起作用。问题是,UTF-8表示形式前面加上了以下字符“ 0xEF,0xBB,0xBF”(请参见Wikipedia page)。对于commons-csv,这似乎是一个已知问题,但由于它是特定于应用程序的,因此不会得到解决(CSVFormat.EXCEL.parse should handle byte order marks)。

但是,有记录的解决方法:

http://commons.apache.org/proper/commons-csv/user-guide.html#Handling_Byte_Order_Marks

答案 1 :(得分:0)

我有同样奇怪的例外。它实际上说“正在期待……”,然后列出它说找不到的字段-就像您的情况一样。

原因是我设置了错误的CSVFormat:

CSVFormat csvFormat = CSVFormat.newFormat(';');

这意味着我的代码试图在实际上具有逗号分隔符的文件中的分号上分隔字段。

一旦我使用了DEFAULT CSVFormat,一切就开始起作用。

CSVFormat csvFormat = CSVFormat.DEFAULT;

所以答案是可能您必须为文件正确设置CSVFormat。

答案 2 :(得分:0)

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