我是Java新手,正在尝试将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
scenario:red
person, male , 16, athletic, boxer , FALSE , TRUE , , , passenger
person, female, 25, athletic, doctor , TRUE , FALSE , , , pedestrian
我需要在任何情况下由任何数量的乘客和行人解析。最后,将这些方案添加到ArrayList中进行分析。
我认为是:
scenario:red
时停止,将乘客和行人添加到Character
ArrayList。 (我已经添加完了,但是不知道如何停止)。scenario
创建scenario(ArrayList<Character> passenger, ArrayList<Character> pedestrians, boolean redOrGreen);
scenarios
添加创建的方案。我所做的是将所有内容放在一起而不是分开。非常感谢任何帮助或提示。
感谢这个为我提供帮助的社区,这是我到目前为止所获得的。
public void loadCsv() throws IOException {
String csvFile = "config.csv";
String line = "";
String csvSplit = "\\s*,\\s*";
Scenario scenario = new Scenario();
Person person = new Person();
Animal animal = new Animal();
ArrayList<Scenario> scenaios = new ArrayList<Scenario>();
ArrayList<String> csvContents = new ArrayList<String>();
ArrayList<Character> passengers = new ArrayList<Character>();
ArrayList<Character> pedestrians = new ArrayList<Character>();
try (BufferedReader csvReader = new BufferedReader(new FileReader(csvFile));) {
String headerLine = csvReader.readLine(); //get rid of the header
//add each line to the arrayList
while ((line = csvReader.readLine()) != null) {
csvContents.add(line);
}
for(String csvLine : csvContents) {
String[] data = csvLine.split(csvSplit); // split by comma and remove redundant spaces
if (data.length == NO_OF_FIELD) { //check and avoid indexOutOfBoundException
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) {
int age;
Gender genderEnum;
BodyType bodyTypeEnum;
Profession professionEnum;
boolean isPregnant;
boolean isYou;
try {
age = Integer.parseInt(data[2]);
genderEnum = Gender.valueOf(data[1].toUpperCase());
bodyTypeEnum = BodyType.valueOf(data[3].toUpperCase());
professionEnum = Profession.valueOf(data[4].toUpperCase());
isPregnant = Boolean.parseBoolean(data[5]);
isYou = Boolean.parseBoolean(data[6]);
person = new Person(age, professionEnum, genderEnum, bodyTypeEnum, isPregnant);
person.setAsYou(isYou);
String role = data[9].toLowerCase();
if ("passenger".equals(role)) {
if (null != person ) {
passengers.add(person);
}
}
else if ("pedestrian".equals(role)) {
if (null != person) {
pedestrians.add(person);
}
}
// dealing with empty profession
} catch (IllegalArgumentException e) {
age = Integer.parseInt(data[2]);
genderEnum = Gender.valueOf(data[1].toUpperCase());
bodyTypeEnum = BodyType.valueOf(data[3].toUpperCase());
professionEnum = Profession.UNKNOWN;
isPregnant = Boolean.parseBoolean(data[5]);
isYou = Boolean.parseBoolean(data[6]);
person = new Person(age, professionEnum, genderEnum, bodyTypeEnum, isPregnant);
person.setAsYou(isYou);
String role = data[9].toLowerCase();
if ("passenger".equals(role)) {
if (null != person ) {
passengers.add(person);
}
}
else if ("pedestrian".equals(role)) {
if (null != person) {
pedestrians.add(person);
}
}
}
}
else if ("animal".equals(clazz) && data.length ==10) {
int age;
Gender genderEnum;
BodyType bodyTypeEnum;
String species;
boolean isPet;
try {
age = Integer.parseInt(data[2]);
genderEnum = Gender.valueOf(data[1].toUpperCase());
bodyTypeEnum = BodyType.valueOf(data[3].toUpperCase());
species = data[7];
isPet = Boolean.parseBoolean(data[8]);
animal = new Animal(age, genderEnum, bodyTypeEnum, species);
animal.setIsPet(isPet);
String role = data[9].toLowerCase();
if ("passenger".equals(role)) {
if (null != animal ) {
passengers.add(animal);
}
}
else if ("pedestrian".equals(role)) {
if (null != animal) {
pedestrians.add(animal);
}
}
// dealing with empty bodyType
} catch (IllegalArgumentException e) {
age = Integer.parseInt(data[2]);
genderEnum = Gender.valueOf(data[1].toUpperCase());
bodyTypeEnum = BodyType.UNSPECIFIED;
species = data[7];
isPet = Boolean.parseBoolean(data[8]);
animal = new Animal(age, genderEnum, bodyTypeEnum, species);
animal.setIsPet(isPet);
String role = data[9].toLowerCase();
if ("passenger".equals(role)) {
if (null != animal ) {
passengers.add(animal);
}
}
else if ("pedestrian".equals(role)) {
if (null != animal) {
pedestrians.add(animal);
}
}
}
}
}
}
//passenger and pedestrians are in position
System.out.println("passengers: " + passengers);
System.out.println("pedestrians: " + pedestrians);
if (null != scenario) {
scenario.setPassengers(passengers);
scenario.setPedestrians(pedestrians);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
[如果可以更改csv文件格式,我将添加方案类型列(如果需要,还可以添加方案ID或名称),因此当您加入表(方案+乘客)时,您可以将csv文件作为数据库的结果集使用+行人),然后返回普通行。
使用这种方法,您将能够将解析委派到任何csv库,并分别进行逻辑处理(按方案ID /名称/类型分组)。
例如,您可以使用univocity简单地将文件解析为模型(甚至使用批注),然后将其迭代地分组和处理。