我是一個初學者java和我有一個Java類,在從CSV文件看起來像這樣的數據讀取:如何解析每個java運行的CSV文件中的單個行併爲下一個運行解析下一行?
BUS | ID |負載| Max_Power
1 | 2 | 1 | 10.9
2 | 3 | 2 | 8.0
我的問題是這樣的:我必須考慮每個java運行(程序執行),一次只有1行。例如,對於我的第一次運行,我只需要讀入第一行,然後對於第二次運行,我需要讀取第二行的數據。 使用HashMap是否可以正確搜索每次運行的密鑰?
我是一個初學者java和我有一個Java類,在從CSV文件看起來像這樣的數據讀取:如何解析每個java運行的CSV文件中的單個行併爲下一個運行解析下一行?
BUS | ID |負載| Max_Power
1 | 2 | 1 | 10.9
2 | 3 | 2 | 8.0
我的問題是這樣的:我必須考慮每個java運行(程序執行),一次只有1行。例如,對於我的第一次運行,我只需要讀入第一行,然後對於第二次運行,我需要讀取第二行的數據。 使用HashMap是否可以正確搜索每次運行的密鑰?
當你的程序必須「記住」超出它的終止的東西時,你需要將這些信息存儲在某處(文件,註冊表等) 。
第1步找出如何用java做文件I/O(讀/寫文件)。你需要這個來存儲你的信息,在這種情況下是行號)。
步驟2實現邏輯:
1
)lineToRead
(1
)讀lineToRead
並解析數據(看一看@Kent小號回答一個很好的解釋如何做到這一點)lineToRead
(1 -> 2
)並將其保存到內存文件中。提示:當你的程序的多張實例會並行運行,你必須確保互斥/使整個過程(讀,增量,寫)的原子以防止更新丟失效應。
謝謝,我明白整個過程是如何工作的,但我沒有清楚地理解第一步,你能給我一個例如? – 2014-10-29 11:52:12
@ neo-su我不能舉一個例子,因爲這個步驟是要搞清楚/學習如何用java做文件I/O,我只能給出一個示例實現,如果你想的話,但那不會是對你而言,這是一種學習效果。 – ifloop 2014-10-29 12:14:33
好的,我知道你的意思是像掃描儀或類似的東西。明白了,謝謝。 – 2014-10-29 12:18:14
當您讀取第一行(標題)時,您分割了|
得到字符串數組(headerArray
)。然後初始化一個hashmap <String, List<String>>
(或Multimap
,如果您使用guava或其他api)並將字符串數組中的元素作爲關鍵字。
然後,您讀取每個數據行,拆分|
,再次得到字符串數組(dataArray
),您只需通過以下方式獲取地圖值:map.get(headerArray[index of dataArray])
。一旦你找到地圖項/值,你可以做以下邏輯(添加到列表)。
您還可以設計一個帶有這些屬性的ValueObjectType
類型,以及一個接受int index, String value
的特殊設置器,您可以檢查該值應該轉到哪個屬性。這樣,你不再需要映射,你需要一個List<ValueObjectType>
可以使用com.csvreader.CsvReader類(在javacsv.jar中可用) 此類提供了逐行讀取CSV文件的功能。 這將用於你的目的。
這裏是示例代碼: -
CsvReader csv = new CsvReader(FileName);
csv.readHeaders(); // headers
while (products.readRecord()) {
String cal = csv.get(0);
}
請確定它們意味着什麼:'每個Java run''第一run'和'第二run'?如果你的意思是3個不同的java進程,你必須以某種方式持久化文件或數據庫中的狀態(最後讀取否,頭文件)。 – Kent 2014-10-28 12:44:11
我通常指的是程序的執行,每次執行時,我只需要一次讀入一行。謝謝您的幫助! – 2014-10-29 10:33:47