正在解析处理空值的 csv 文件 java
parsing csv file dealing with empty value java
我是 java 的新手,正在练习解析 csv 文件。我已经弄清楚如何解析和使用构造函数来创建实例。但是,我的 csv 文件中有空字符串,控制台只是向我抛出 IllegalArgumentException: No enum constant
。
我提到过:
- enum valueOf IllegalArgumentException: No enum const class
不幸的是,它不起作用。当 Person
为空 Profession
时,程序中断。我是否需要填写 "NONE" 之类的字符串来匹配枚举,或者有什么办法可以解决这个问题?非常感谢任何帮助或提示。
这是我的 Profession
例如:
public enum Profession {
DOCTOR, CEO, CRIMINAL, HOMELESS, UNEMPLOYED, MUSICIAN, BOXER , UNKNOWN, NONE;
}
这是我的 csv 文件的样子:
[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 , , FALSE , , , , passenger
animal, male , 4, , , FALSE , , dog , TRUE , pedestrian
.
.
解析代码如下:
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(",",-1);
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().trim());
Gender genderEnum = Gender.valueOf(data[1].toUpperCase().trim());
BodyType bodyTypeEnum =BodyType.valueOf(data[3].toUpperCase().trim());
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)) {
Gender genderEnum = Gender.valueOf(data[1].toUpperCase().trim());
BodyType bodyTypeEnum =BodyType.valueOf(data[3].toUpperCase().trim());
animal = new Animal(Integer.parseInt(data[2]) , genderEnum , bodyTypeEnum, data[7]);
animal.setIsPet(Boolean.parseBoolean(data[8]));
}
} catch (someException e) {
e.printStackTrace();
}
解析后的行如下所示:
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,,,,,,,,,
按如下操作:
final int NO_OF_FIELDS = 10;
for (String csvLine : csvContents) {
// split by comma and remove redundant spaces
String[] data = csvLine.split(",", -1);
if (data.length == NO_OF_FIELDS) {// <---Add this check to avoid ArrayIndexOutOfBoundsException
System.out.println(data[1]);
Character character = null;
String clazz = data[0].trim().toLowerCase();// <---Trim to get rid of leading and trailing space
if (clazz.startsWith("scenario" && data.length == 1)) {
// ...
} else if ("person".equals(clazz) && data.length == 10) {
// Handle the exception as shown below
Profession professionEnum;
try {
professionEnum = Profession.valueOf(data[4].trim().toUpperCase());// <---First trim then apply
// toUpperCase()
} catch (IllegalArgumentException e) {
professionEnum = Profession.UNKNOWN;
}
// ...
} else if ("animal".equals(clazz)) {
// ...
}
}
}
我是 java 的新手,正在练习解析 csv 文件。我已经弄清楚如何解析和使用构造函数来创建实例。但是,我的 csv 文件中有空字符串,控制台只是向我抛出 IllegalArgumentException: No enum constant
。
我提到过:
- enum valueOf IllegalArgumentException: No enum const class
不幸的是,它不起作用。当 Person
为空 Profession
时,程序中断。我是否需要填写 "NONE" 之类的字符串来匹配枚举,或者有什么办法可以解决这个问题?非常感谢任何帮助或提示。
这是我的 Profession
例如:
public enum Profession {
DOCTOR, CEO, CRIMINAL, HOMELESS, UNEMPLOYED, MUSICIAN, BOXER , UNKNOWN, NONE;
}
这是我的 csv 文件的样子:
[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 , , FALSE , , , , passenger
animal, male , 4, , , FALSE , , dog , TRUE , pedestrian
.
.
解析代码如下:
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(",",-1);
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().trim());
Gender genderEnum = Gender.valueOf(data[1].toUpperCase().trim());
BodyType bodyTypeEnum =BodyType.valueOf(data[3].toUpperCase().trim());
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)) {
Gender genderEnum = Gender.valueOf(data[1].toUpperCase().trim());
BodyType bodyTypeEnum =BodyType.valueOf(data[3].toUpperCase().trim());
animal = new Animal(Integer.parseInt(data[2]) , genderEnum , bodyTypeEnum, data[7]);
animal.setIsPet(Boolean.parseBoolean(data[8]));
}
} catch (someException e) {
e.printStackTrace();
}
解析后的行如下所示:
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,,,,,,,,,
按如下操作:
final int NO_OF_FIELDS = 10;
for (String csvLine : csvContents) {
// split by comma and remove redundant spaces
String[] data = csvLine.split(",", -1);
if (data.length == NO_OF_FIELDS) {// <---Add this check to avoid ArrayIndexOutOfBoundsException
System.out.println(data[1]);
Character character = null;
String clazz = data[0].trim().toLowerCase();// <---Trim to get rid of leading and trailing space
if (clazz.startsWith("scenario" && data.length == 1)) {
// ...
} else if ("person".equals(clazz) && data.length == 10) {
// Handle the exception as shown below
Profession professionEnum;
try {
professionEnum = Profession.valueOf(data[4].trim().toUpperCase());// <---First trim then apply
// toUpperCase()
} catch (IllegalArgumentException e) {
professionEnum = Profession.UNKNOWN;
}
// ...
} else if ("animal".equals(clazz)) {
// ...
}
}
}