正在 java 中使用 indexOutOfBound 解析 csv 文件
Parsing csv file with indexOutOfBound in java
我是 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,,,,,,,,,
拆分后数据只有一个元素,这样当你访问数据[1]时,就会出现异常。
解决方案:尝试使用另一个正则表达式,例如“,”。
Ps:您的 csv 在
处格式错误
scenario:green, , , , , , , ,
Try to put one more ","
您需要为一行中的所有单元格填写完整数据。
例如。 csv 中的第一行仅包含一个具有值 scenario:green 的单元格,即 data[0].
如果您在 csv 中为所有其他单元格填写数据,您将开始接收数据[1]、数据[2]、数据[3]....
我已经弄明白了。不过,这对我来说是违反直觉的。我需要指定解析的 data
数组的 length
以放置每个属性,如下所示:
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
if (clazz.startsWith("scenario"&& data.length == 1)) {
scenario = new Scenario();
scenario.setLegalCrossing(clazz.endsWith("green"));
continue;
} else if ("person".equals(clazz)&& data.length == 10) {
Profession professionEnum = Profession.valueOf(data[4].toUpperCase());
Gender genderEnum = Gender.valueOf(data[1].toUpperCase());
BodyType bodyTypeEnum =BodyType.valueOf(data[3].toUpperCase());
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();
}
我是 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,,,,,,,,,
拆分后数据只有一个元素,这样当你访问数据[1]时,就会出现异常。 解决方案:尝试使用另一个正则表达式,例如“,”。
Ps:您的 csv 在
处格式错误scenario:green, , , , , , , , Try to put one more ","
您需要为一行中的所有单元格填写完整数据。
例如。 csv 中的第一行仅包含一个具有值 scenario:green 的单元格,即 data[0].
如果您在 csv 中为所有其他单元格填写数据,您将开始接收数据[1]、数据[2]、数据[3]....
我已经弄明白了。不过,这对我来说是违反直觉的。我需要指定解析的 data
数组的 length
以放置每个属性,如下所示:
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
if (clazz.startsWith("scenario"&& data.length == 1)) {
scenario = new Scenario();
scenario.setLegalCrossing(clazz.endsWith("green"));
continue;
} else if ("person".equals(clazz)&& data.length == 10) {
Profession professionEnum = Profession.valueOf(data[4].toUpperCase());
Gender genderEnum = Gender.valueOf(data[1].toUpperCase());
BodyType bodyTypeEnum =BodyType.valueOf(data[3].toUpperCase());
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();
}