我在尝试将excel文件转换为arraylist或仅包含存储在不同单元格中的信息的数组时遇到了一些麻烦。 信息存储在excel中,如下例所示:
所有者的信息;汽车的所有者;汽车的卖家;
日期;汽车品牌 ;门数;汽车牌照;汽车颜色; 价
2.3.2013;菲亚特; 4; 23-21-AA;黑色 ; 10.000
2.1.2014;雷诺; 4; 23-12-BA;蓝色 ; 25.000
我需要访问诸如getBrand(),getLicense等信息,所以我想将这些不同的信息存储到arraylists,OwnerInfo [Owner [],Seller []] 后来我想总结汽车价格或其他东西,因此我想访问CarInfo [6]并总结它们。
我有点迷失,需要一些建议或提示。
public static void main(String args[]) {
try {
FileInputStream fstream = new FileInputStream(
"file.csv");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
while ((strLine = br.readLine()) != null) {
String[] tokens = strLine.split(";");
for (int i = 0; i < tokens.length; i++) {
System.out.println(tokens[i]);
}
}
in.close();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}
另一个问题是我何时使用
for (int i = 0; i < tokens.length; i++) {
System.out.println(tokens[0]);
}
它将打印excel的第一列(.csv),但是如果我打印令牌[1]它就不会打印任何东西。为什么?
此外,如果我在.txt文件上执行相同的操作,它将打印第二个&#34;列&#34;。
答案 0 :(得分:0)
可能你可以重新考虑你的“设计”。现在你要做的是,将每一行存储在一个java数组中。这对您以后的处理不方便(如您所述)。
您可以考虑以下两种选择:
如果你喜欢数组,你可以建立map<String, String[] (or number)>
第一个字符串,是标题行的标签,如number of door
,car owner...
当然你可以使用一些它的简称。和数组是列。因此,如果您想要一些列数据,只需map.get(name)
。如果您可以使用第三方库,请考虑使用guava中的multimap
等扩展地图类型来简化您的实施。
您可以为每一行构建自己的类型(类),例如CarData
,并为每行生成每个CarData
对象,将它们打包到Collection中。如果需要,您可以构建一些帮助方法来从列表中获取有趣的值。
我希望我理解你的问题,并希望上面的文字有所帮助。
答案 1 :(得分:0)
您可以使用https://github.com/CyborTronik/fluent-ssv将CSV转换为bean。在您的情况下,您需要为流构建器提供值分隔符。 所以你会有类似的东西:
carsStream = new SsvStreamBuilder<Car>()
.withSeparator(";")
.forEntity(Car.class)
.stream("~/path/to/file");
瞧,请使用bean流而不是数组。