首页 > 解决方案 > 为什么在读取 .csv 文件时出现 ArrayIndexOutOfBoundsException?

问题描述

我正在尝试读取 .csv 文件,如下所示:

BufferedReader reader = Files.newBufferedReader(Paths.get("przedmioty.csv"));

CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withHeader("Name", "Teacher", "Years").withIgnoreHeaderCase().withTrim());

for (CSVRecord csvRecord: csvParser) {
    // Accessing Values by Column Index

    String name = csvRecord.get(0);
    //Accessing the values by column header name
    String Teacher= csvRecord.get(1);
    String years = csvRecord.get(2);

    //Printing the record
    System.out.println("Record Number - " + csvRecord.getRecordNumber());
    System.out.println("Name: " + name);
    System.out.println("Teacher: " + Teacher);
    System.out.print("Years : " + years );
    System.out.println("\n\n");
}

这就是我的 .csv 的样子

    Name            Teacher                 Years
    Math            Leszek Krauze           2
    X               Grimm Dostojowksi       3
    Y               Dimitriv Vladiskovic    4

我越来越

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at org.apache.commons.csv.CSVRecord.get(CSVRecord.java:79)
at main.Task01.main(Task01.java:294)

我使用 apache commons csv。

标签: javacsvapache-commonsopencsv

解决方案


我已尝试使用以下代码,它对我来说工作正常。你也可以检查。我正在使用通用 CSV 版本 1.4。请检查下面的代码。我修改了下面的代码。

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;

import java.io.FileReader;
import java.io.Reader;

public class Test2 {
  public static void main(String[] args) throws Exception {
    Reader in =
        new FileReader(
            "przedmioty.csv");
    Iterable<CSVRecord> records =
        CSVFormat.TDF
    .withRecordSeparator("\r\n")
            .withFirstRecordAsHeader()
            .withHeader("Name", "Teacher", "Years")
            .withIgnoreHeaderCase()
            .parse(in);

    for (CSVRecord csvRecord : records) {
      String name = csvRecord.get(1);
      // Accessing the values by column header name
      String Teacher = csvRecord.get(2);
      String years = csvRecord.get(3);

      // Printing the record
      System.out.println("Record Number -> " + csvRecord.getRecordNumber());
      System.out.println("Name: " + name);
      System.out.println("Teacher: " + Teacher);
      System.out.print("Years : " + years);
      System.out.println("\n\n");
    }
  }
}

您提到的制表符分隔的 CSV 文件存在一些问题。我在 github 链接下方提供,以便您可以运行和测试,并且它在 testdata 文件夹中还有一个 csv 文件。它是基于 Maven 的项目。

https://github.com/debjava/sample-tab-csv-parser 希望它能解决你的问题。


推荐阅读