在Java中解析后如何处理csv.file数据 [英] How to process csv.file data after parsing in java
问题描述
我是java的新手,正在练习处理csv文件。我已经成功解析了csv文件,将其保存在数组中,并且摆脱了标题。
I am new to java and practicing processing csv file. I've already successfully parsed the csv file, saved it in an array, and got rid of the header.
文件如下:
class, gender, age, bodyType, profession, pregnant, species, isPet, role
scenario:green, , , , , , ,
person, female, 24, average , doctor , FALSE , , , passenger
animal, male , 4 , , FALSE , dog , true , pedestrian
.
.
文件中没有字符串的列为空。像上面的物种和isPet一样。
the column without a string is empty in the file. Like the species and isPet above.
现在,我想遍历此数组并创建实例,这对我来说太复杂了。
Now, I want to iterate through this array and create the instance, and it's too complex for me to figure it out.
例如,我有一个带有构造函数的 Scenario
类:
For example, I have a Scenario
class with the constructor:
Scenario(ArrayList<Character> passenger, ArrayList<Character> pedestrian, boolean greenOrRed)
,并且在创建场景实例之前,我必须使用两个不同子类 Person 的构造函数创建
Character
。 code>和动物
。此外,将它们分为两个单独的组,分别是乘客
和行人
:
and before creating scenario instance, I have to create Character
by the constructor with two different subclasses Person
and Animal
. Further, arrange them into two separate groups, which are passenger
and pedestrian
:
Person(Gender gender, int age, Profession profession, BodyType bodyType, boolean isPregnant)
Animal(Gender gender, int age, BodyType bodyType, String species)
我尝试过的操作:
public void loadCsv() throws IOException {
String csvFile = "config.csv";
String line = "";
String csvSplit = ",";
try (BufferedReader csvReader = new BufferedReader(new FileReader(csvFile));) {
String headerLine = csvReader.readLine();
while ((line = csvReader.readLine()) != null) {
for (String token : data) {
if (!token.isEmpty() && token.equals("scenario:green")) {
scenario.setLegalCrossing(true); //pass to setter works
//how to process with next token?
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return;
}
}
我已经提到了帖子:如何轻松处理CSV文件到List< MyClass>
任何帮助或提示都受到高度赞赏。
Any help or hint is highly appreciated.
编辑
顺序如下:
首先,在场景中设置布尔值greenOrRed
类。
//if the class equals to Scenario:green
setLegalCrossing(true);
第二个是生成 Person
和动物
//if class equals to Person
Person people =Person(Gender gender, int age, Profession profession, BodyType bodyType, boolean isPregnant)
//if class equals to Animal
Animal animal = Animal(Gender gender, int age, BodyType bodyType, String species)
第三,将它们添加到超类数组中:
Third, add them into superclass array:
ArrayList<Character> passenger = new ArrayList<Character>();
ArrayList<Character> pedestrian = new ArrayList<Character>();
passenger.add(people); // if role equals passenger
pedestrian.add(animal); // if role equals pedestrian
最后,将乘客和行人添加到场景<
Finally, add passenger and pedestrian into Scenario
constructor with the first step boolean value to form an instance.
Scenario singleScenario = Scenario(passenger, pedestrian, legalCrossing)
推荐答案
请查看以下示例,示例数据(省略了读取CSV文件和跳过标题的所有详细信息):
Please review the following example of parsing your sample data (all details of reading the CSV file and skipping the header are omitted):
List<String> csvContents = Arrays.asList(
// "class, gender, age, bodyType, profession, pregnant, species, isPet, role",
"scenario:green",
"person, female, 24, average , doctor , FALSE , , , passenger",
"animal, male , 4, , , FALSE , dog , true , pedestrian"
);
Scenario scenario = null;
List<Character> passengers = new ArrayList<>();
List<Character> pedestrians = new ArrayList<>();
for (String line : csvContents) {
String[] data = line.split("\\s*,\\s*"); // split by comma and remove redundant spaces
Character character = null;
String clazz = data[0].toLowerCase();
if (clazz.startsWith("scenario")) {
scenario = new Scenario();
scenario.setLegalCrossing(clazz.endsWith("green"));
continue;
} else if ("person".equals(clazz)) {
character = new Person(data[1], Integer.parseInt(data[2]), data[3], data[8], data[4], Boolean.parseBoolean(data[5]));
} else if ("animal".equals(clazz)) {
character = new Animal(data[1], Integer.parseInt(data[2]), data[3], data[8], data[6], Boolean.parseBoolean(data[7]));
}
String role = data[8].toLowerCase();
if ("passenger".equals(role)) {
if (null != character) passengers.add(character);
} else if ("pedestrian".equals(role)) {
if (null != character) pedestrians.add(character);
}
}
System.out.println("passengers: " + passengers);
System.out.println("pedestrians: " + pedestrians);
if (null != scenario) {
scenario.setPassengers(passengers);
scenario.setPedestrians(pedestrians);
}
输出:
passengers: [Person(super=Character(gender=female, age=24, bodyType=average, role=passenger), profession=doctor, isPregnant=false)]
pedestrians: [Animal(super=Character(gender=male, age=4, bodyType=, role=pedestrian), species=dog, isPet=true)]
您应该能够将此代码段作为参考,并根据需要进行修改。
You should be able to use this code snippet as a reference and modify it according to your needs.
这篇关于在Java中解析后如何处理csv.file数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!