2014-10-28 29 views
1

我是一個初學者java和我有一個Java類,在從CSV文件看起來像這樣的數據讀取:如何解析每個java運行的CSV文件中的單個行併爲下一個運行解析下一行?

BUS | ID |負載| Max_Power

1 | 2 | 1 | 10.9

2 | 3 | 2 | 8.0

我的問題是這樣的:我必須考慮每個java運行(程序執行),一次只有1行。例如,對於我的第一次運行,我只需要讀入第一行,然後對於第二次運行,我需要讀取第二行的數據。 使用HashMap是否可以正確搜索每次運行的密鑰?

+1

請確定它們意味着什麼:'每個Java run''第一run'和'第二run'?如果你的意思是3個不同的java進程,你必須以某種方式持久化文件或數據庫中的狀態(最後讀取否,頭文件)。 – Kent 2014-10-28 12:44:11

+0

我通常指的是程序的執行,每次執行時,我只需要一次讀入一行。謝謝您的幫助! – 2014-10-29 10:33:47

回答

0

當你的程序必須「記住」超出它的終止的東西時,你需要將這些信息存儲在某處(文件,註冊表等) 。

第1步找出如何用java做文件I/O(讀/寫文件)。你需要這個來存儲你的信息,在這種情況下是行號)。

步驟2實現邏輯:

  • 從數據文件存儲器文件(例如1
  • 讀取線lineToRead1)讀lineToRead並解析數據(看一看@Kent小號回答一個很好的解釋如何做到這一點)
  • 增量lineToRead1 -> 2)並將其保存到內存文件中。

提示:當你的程序的多張實例會並行運行,你必須確保互斥/使整個過程(讀,增量,寫)的原子以防止更新丟失效應

+0

謝謝,我明白整個過程是如何工作的,但我沒有清楚地理解第一步,你能給我一個例如? – 2014-10-29 11:52:12

+0

@ neo-su我不能舉一個例子,因爲這個步驟是要搞清楚/學習如何用java做文件I/O,我只能給出一個示例實現,如果你想的話,但那不會是對你而言,這是一種學習效果。 – ifloop 2014-10-29 12:14:33

+1

好的,我知道你的意思是像掃描儀或類似的東西。明白了,謝謝。 – 2014-10-29 12:18:14

0

當您讀取第一行(標題)時,您分割了|得到字符串數組(headerArray)。然後初始化一個hashmap <String, List<String>>(或Multimap,如果您使用guava或其他api)並將字符串數組中的元素作爲關鍵字。

然後,您讀取每個數據行,拆分|,再次得到字符串數組(dataArray),您只需通過以下方式獲取地圖值:map.get(headerArray[index of dataArray])。一旦你找到地圖項/值,你可以做以下邏輯(添加到列表)。

您還可以設計一個帶有這些屬性的ValueObjectType類型,以及一個接受int index, String value的特殊設置器,您可以檢查該值應該轉到哪個屬性。這樣,你不再需要映射,你需要一個List<ValueObjectType>

+0

很好的解釋,但沒有要求。 OP詢問如何只讀取第一個程序執行時的第一個(數據)行,第二個程序執行時只讀取第二個(數據)行......第n個程序執行時只讀取第n個(數據)行。 – ifloop 2014-10-28 12:40:06

+0

@ifLoop哦,我看了兩遍這個問題,看起來你是對的.... :-( – Kent 2014-10-28 12:42:32

0

可以使用com.csvreader.CsvReader類(在javacsv.jar中可用) 此類提供了逐行讀取CSV文件的功能。 這將用於你的目的。

這裏是示例代碼: -

CsvReader csv = new CsvReader(FileName); 
     csv.readHeaders(); // headers 
     while (products.readRecord()) { 

      String cal = csv.get(0); 
     }