java将csv数据解析为具有不同列长度的对象
我是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
阵列列表中。(我已经添加了,但不知道如何停止)李> - 使用构造函数
scenario(ArrayList<Character> passenger, ArrayList<Character> pedestrians, boolean redOrGreen);
创建一个scenario
- ArrayList
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) {
person = loadCsvPerson(data);
addCharacter(person, data);
}
else if ("animal".equals(clazz) && data.length ==10) {
animal = loadCsvAnimal(data);
addCharacter(animal, data);
}
}
}
}
//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();
}
}
# 1 楼答案
如果可以更改csv文件格式,我将添加scenario type列(以及scenario id或name,如果需要),以便在连接表(scenario+passenger+Pedering)并返回普通行时,可以使用csv文件作为数据库中的结果集
使用这种方法,您将能够将解析委托给任何csv库,并分别执行您的逻辑(按场景id/名称/类型分组)。使用代理行(场景:绿色…)您必须编写自定义解析器
例如,您可以使用univocity简单地将文件解析到您的模型中(甚至使用注释),并迭代地对其进行分组和处理
# 2 楼答案
或者,如果需要使用现有文件格式,请执行以下操作:
# 3 楼答案
我需要在第二轮中添加上一个
scenario
。 由于最后一组数据不会被捕获,我需要设置另一个新的scenario
来添加它。谢谢你的艺术,先生# 4 楼答案
需要在代码中解决以下问题:
尽量避免使用标准库已经使用过的类的名称(特别是当它在默认包中时,
java.lang
),例如,Java库中已经有一个类Character,因此您应该为自定义类使用不同的名称使用
continue
跳过行scenario:red
如果已经定义了
final int NO_OF_FIELD = 10
,则可以使用相同的值,而不是直接使用值10
,即在以下代码中应使用NO_OF_FIELD
而不是10
:但是,您还需要了解
&& data.length ==10
在这里是不必要的,因为您已经在封闭的if
条件中选中了data.length == NO_OF_FIELD
我无法理解你其余的观点。如果你能澄清这些问题,我将能进一步帮助你