Java CSV数据到数组中

时间:2014-04-28 11:03:08

标签: java arrays csv arraylist split

我在尝试将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;。

2 个答案:

答案 0 :(得分:0)

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

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

  • 如果你喜欢数组,你可以建立map<String, String[] (or number)>第一个字符串,是标题行的标签,如number of doorcar 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流而不是数组。