2014-04-28 58 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"); 

瞧,豆類代替陣列的使用流。