将Java CSV数据放入数组

将Java CSV数据放入数组,java,arrays,csv,arraylist,split,Java,Arrays,Csv,Arraylist,Split,我在尝试将excel文件转换为arraylist或仅转换为包含存储在不同单元格中的信息的数组时遇到一些问题。 信息存储在excel中,如下示例所示: 业主信息;车主;汽车销售商 日期;汽车品牌;门的数量;汽车牌照;汽车颜色; 价格 2.3.2013;法令4.23-21-AA;黑色10000 2.1.2014;雷诺;4.23-12-BA;蓝色25000 我需要访问诸如getBrand()、getLicense等信息,所以我想将这些不同的信息存储到ArrayList、OwnerInfo[Owner[

我在尝试将excel文件转换为arraylist或仅转换为包含存储在不同单元格中的信息的数组时遇到一些问题。 信息存储在excel中,如下示例所示:

业主信息;车主;汽车销售商

日期;汽车品牌;门的数量;汽车牌照;汽车颜色; 价格

2.3.2013;法令4.23-21-AA;黑色10000

2.1.2014;雷诺;4.23-12-BA;蓝色25000

我需要访问诸如getBrand()、getLicense等信息,所以我想将这些不同的信息存储到ArrayList、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());
    }
}
publicstaticvoidmain(字符串参数[]){
试一试{
FileInputStream fstream=新FileInputStream(
“file.csv”);
DataInputStream in=新的DataInputStream(fstream);
BufferedReader br=新的BufferedReader(新的InputStreamReader(in));
弦斯特林;
而((strLine=br.readLine())!=null){
String[]tokens=strLine.split(“;”);
对于(inti=0;i
}

另一个问题是我何时使用

for (int i = 0; i < tokens.length; i++) { 
    System.out.println(tokens[0]);
}
for(inti=0;i
它将打印excel(.csv)的第一列,但如果我打印令牌[1],它将不会打印任何内容。为什么


此外,如果我在.txt文件上执行相同的操作,它将打印第二个“列”。

可能您可以重新考虑您的“设计”。现在要做的是,将每一行存储在java数组中。这不便于您以后处理(如您所述)

您可以考虑以下两种选择:

  • 如果您喜欢数组,您可以构建一个
    映射
    第一个字符串,是标题行的标签,如
    门的编号
    车主…
    当然您可以使用一些简短的名称,数组就是列。因此,如果需要一些列数据,只需
    map.get(name)
    。如果你可以使用第三方LIB,考虑一些扩展的映射类型,如<代码> Multuap < /Go> >番石榴,以便于实现。

  • 您可以为每一行构建自己的类型(类),如
    CarData
    ,并为每一行生成每个
    CarData
    对象,将它们打包到一个集合中。如果需要,您可以构建一些helper方法来从列表中获取感兴趣的值

我个人更喜欢第二个,因为它很灵活。考虑一下你们将来是否有需求,比如排序(比较器),以其他格式输出行,报告

我希望我正确地理解了您的问题,并希望上面的文字能有所帮助。

您可以使用它将CSV转换为bean。在您的情况下,您需要向流生成器提供值分隔符。 所以你会有这样的想法:

carsStream = new SsvStreamBuilder<Car>()
  .withSeparator(";")
  .forEntity(Car.class)
  .stream("~/path/to/file");
carsStream=new-SsvStreamBuilder()
.带分隔符(“;”)
.forEntity(汽车类)
.stream(“~/path/to/file”);

瞧,使用bean流而不是数组。

我看到的是,您正在一个网格上拆分;当您使用csv时,这意味着您的分隔符是一个逗号,当我使用“;”作为分隔符时,它似乎只起“作用”。您可以尝试将excel保存为csv,然后使用“打开方式”选项在记事本中打开csv文件。然后将这些信息添加到你的帖子中,这会有所帮助。