使用Java中的indexOutOfBound解析csv文件

问题描述 投票:0回答:1

我是Java新手,练习解析csv文件。我确实了解IndexOutOfBound的含义,但我不理解为什么我的解析数据不能像我访问过的所有教程(例如https://examples.javacodegeeks.com/java-csv-parsing-example/

一样)

我只能读取第一列,即data[0]。我的解析方法一定存在问题,但我无法弄清楚。非常感谢任何帮助或提示。

我的数据文件看起来像这样:

  [0],    [1], [2],    [3]  ,    [4]    ,   [5]   ,  [6] ,   [7]  ,  [8] , [9]
class, gender, age, bodyType, profession, pregnant, isYou ,species, isPet, role
scenario:green,   ,         ,           ,         ,        ,      ,      ,
person, female, 24, average , doctor    , FALSE   ,        ,      ,      , passenger
animal, male  ,  4,         ,           , FALSE   ,        , dog  , TRUE , pedestrian
  .
  .

我试图这样解析:

ArrayList<String> csvContents = new ArrayList<String>();    

try (BufferedReader csvReader = new BufferedReader(new FileReader(csvFile));) {
        String headerLine = csvReader.readLine(); //get rid of header

        while ((line = csvReader.readLine()) != null) { 
            csvContents.add(line);// add the line to the ArrayList      
        }

for (String csvLine : csvContents) {

            // split by comma and remove redundant spaces
            String[] data = csvLine.split("\\s*,\\s*"); 
            System.out.println(data[1]);// IndexOutOfBound

            Character character = null;
            String clazz = data[0].toLowerCase();// cannot use word "class" as a variable

            Profession professionEnum = Profession.valueOf(data[4].toUpperCase());  
            Gender genderEnum = Gender.valueOf(data[1].toUpperCase());
            BodyType bodyTypeEnum =BodyType.valueOf(data[3].toUpperCase());

            if (clazz.startsWith("scenario")) { 
                scenario = new Scenario();
                scenario.setLegalCrossing(clazz.endsWith("green"));
                continue;
            } else if ("person".equals(clazz)) {

                person = new Person(Integer.parseInt(data[2]), professionEnum ,genderEnum , bodyTypeEnum , Boolean.parseBoolean(data[5]));
                person.setAsYou(Boolean.parseBoolean(data[6]));
            } else if ("animal".equals(clazz)) {
                animal = new Animal(Integer.parseInt(data[2]) , genderEnum , bodyTypeEnum, data[7]);
                animal.setIsPet(Boolean.parseBoolean(data[8]));
            }
} catch (someException e) {
      e.printStackTrace();
}

编辑

分割前打印出csvLine

scenario:green,,,,,,,,,
person,female,24,average,doctor,false,false,,,passenger
person,male,40,overweight,unknown,false,false,,,passenger
person,female,2,average,,false,false,,,passenger
person,male,82,average,,false,false,,,pedestrian
person,female,32,average,ceo,true,false,,,pedestrian
person,male,7,athletic,,false,false,,,pedestrian
animal,male,4,,,false,false,dog,true,pedestrian
scenario:red,,,,,,,,,
java indexoutofboundsexception
1个回答
0
投票

enter image description here

[分割后,数据只有一个元素,因此,当您访问数据[1]时,您将获得异常。解决方案:仅尝试使用另一个正则表达式,例如“,”。

Ps:您的csv格式不正确

场景:绿色,,,,,,,, 尝试再放一个“,”


0
投票

您需要为一行中的所有单元格填写完整数据。

例如csv中的第一行仅包含1个单元格,该单元格的值scenario:green为data [0]。

如果您为csv中的所有其他单元格填充数据,您将开始接收data [1],data [2],data [3]...。

© www.soinside.com 2019 - 2024. All rights reserved.