2011-04-19 99 views
3

嘿, 我需要讀取java中的文本文件。問題是,該文件的格式如下:在java中讀取文本文件

Id time1 time2 time3 ... 
ID2 time1 time2 time3 ... 

我需要能夠先閱讀所有的ID,然後讀取所有的時間1,那麼所有時間2等 誰能給我一些提示如何能我這樣做,請在Java?效率在這裏很重要,因爲這需要完成的時間< - 這是我的問題 在此先感謝您的幫助

+5

請參閱谷歌約1十億如何在一個文件中讀取一行一行地在Java中的例子。或搜索SO。 – 2011-04-19 12:10:49

+0

問題是效率問題,我已經天真地逐行實現了這個閱讀,並且到達了指定的定時器,但是它需要很長的時間。 – tzer 2011-04-19 12:12:38

+0

@Richard我不認爲他的問題與讀取文本文件有關,而是高效地讀取該特定結構的文本文件... – Diego 2011-04-19 12:12:41

回答

2

轉置文件。第1行的ID,第2行的時間1等等。當然,如果這隻能完成一次,然後對該文件進行多次讀取,這是有益的。

2

最簡單的方法是通過線一次讀取整個文件中的行,解析線,當您去 - 那麼你可以很容易得到「所有ID」,其次是「所有的第一次」等

如果文件太大無法做到這一點,您可能需要考慮編寫一個工具來更改文件結構 - 打開多個文件進行寫入(每列一個),然後您可以讀取輸入行,寫入輸出數據到每個文件,移到下一行等等。你可以做一次,然後在你需要的時候讀取每個文件。

2

一個解決方案是解析文件一次,並創建文件中每個ID位置的索引。然後,您可以根據需要將讀數「光標」重新定位到ID。

EDIT

該解決方案是實際的,如果整個文件的內容不能被加載到存儲器。爲了限制物理讀數的數量,保留最近讀取或使用的id時間組合的LRU緩存可以提高性能。

1

我們無法逐列讀取文件。讀取整個文件到存儲器(的java.nioFileReader)和parse在數據結構(在每一行String#split)的含量等

Map<String, List<String>> 

其中地圖鍵是id(ID,ID2,...)和所述值一個包含所有時間值的簡單列表。

0

如果你是一個Linux/UNIX平臺上,你可以做一些預處理與cut命令