2014-04-28 59 views
0

我在尝试将excel文件转换为数组列表或仅包含存储在不同单元中的信息的数组时遇到了一些麻烦。 信息存储在excel中,如下例所示:将Java CSV数据存入数组

业主信息;车主;汽车的卖家;

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

2.3.2013;菲亚特4; 23-21-AA;黑色 ; 10.000

2.1.2014;雷诺; 4; 23-12-BA;蓝色 ; 25.000

我将需要访问的信息,如getBrand(),getLicense等,所以我想保存这些不同的信息进入的ArrayList,OwnerInfo [所有者[],则卖方[] 后来我想总结汽车价格或别的东西,因此我想访问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文件上做同样的事情,它将打印第二个“列”。

+1

我看到的是你正在分裂一个**; **而你使用的是csv,这意味着你的分隔符是一个逗号**,​​* – AdityaKeyal

+0

当我使用“;”时,它似乎只是“工作”作为分隔符 – JDev

+0

您可以尝试将excel另存为csv,然后使用open with选项打开记事本中的csv文件。然后将信息添加到您的帖子,这将有所帮助。 – AdityaKeyal

回答

0

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

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

  • 如果你爱阵,你可以建立一个map<String, String[] (or number)>第一个字符串,是您的标题行的标签,像number of door,当然car owner...可以为此使用一些简短的名称,而数组则是列。因此,如果你想要一些列数据,你只需要map.get(name)。如果您可以使用第三方库,请考虑一些扩展映射类型,例如来自番石榴的multimap,以简化您的实现。

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

我个人更喜欢第二个,因为它很灵活。想想看,如果你将来需要像排序(比较器),输出其他格式的行,报告.....

我希望我理解你的问题,并希望上面的文字有所帮助。

0

您可以使用https://github.com/CyborTronik/fluent-ssv将CSV转换为bean。在你的情况下,你需要为流生成器提供值分隔符。 所以,你会碰到这样的:

carsStream = new SsvStreamBuilder<Car>() 
    .withSeparator(";") 
    .forEntity(Car.class) 
    .stream("~/path/to/file"); 

瞧,豆类代替阵列的使用流。