如何更有效率的把EXCEL所有欄位讀入記憶體 |
答題得分者是:yorkland
|
chrislove87
一般會員 發表:11 回覆:14 積分:5 註冊:2007-05-09 發送簡訊給我 |
|
yorkland
高階會員 發表:2 回覆:138 積分:108 註冊:2004-12-17 發送簡訊給我 |
|
2007
中階會員 發表:54 回覆:90 積分:98 註冊:2008-08-12 發送簡訊給我 |
用 ado元件 會不會比較快!! ps:沒試過 ===================引 用 chrislove87 文 章=================== 我的EXCEL資料 有13000筆 每筆23個欄位 要將它們全數讀到記憶體內做運算 但是光讀入記憶體就要花十幾二十分鐘(視CPU而定) 我是存到AnsiString陣列,使用ole元件來讀EXCEL 不知道有沒有更有效率的方法呢? |
chrislove87
一般會員 發表:11 回覆:14 積分:5 註冊:2007-05-09 發送簡訊給我 |
===================引 用 yorkland 文 章=================== 如果是以CELL一格一格讀進來的方式, 那速度肯定不理想。 但透過OLE一次讀入一個Array, 速度好像也快不到那裡。 我的作法如下: 1. 先把Excel匯出至文字檔(CSV或TXT...)。 2. 以TStringList.LoadFromFile()載入這個文字檔, 然後再一行一行Decode文字內容。 我想這個速度可能會好一些。 你參考看看... 感謝您提供的方法!速度果然好很多! 不過經過測試發現,我的Excel資料是二維的, 而TStringList似乎是一維的? 還有沒有其他的辦法也能這麼快呢? |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
要再快就要把 StringList, String 這種東西去掉.
自己用 char array[] 這種模式去處理.會更快. ===================引 用 chrislove87 文 章=================== ===================引 用 yorkland 文 章=================== 如果是以CELL一格一格讀進來的方式, 那速度肯定不理想。 但透過OLE一次讀入一個Array, 速度好像也快不到那裡。 我的作法如下: 1. 先把Excel匯出至文字檔(CSV或TXT...)。 2. 以TStringList.LoadFromFile()載入這個文字檔, 然後再一行一行Decode文字內容。 我想這個速度可能會好一些。 你參考看看... 感謝您提供的方法!速度果然好很多! 不過經過測試發現,我的Excel資料是二維的, 而TStringList似乎是一維的? 還有沒有其他的辦法也能這麼快呢? |
yorkland
高階會員 發表:2 回覆:138 積分:108 註冊:2004-12-17 發送簡訊給我 |
|
chrislove87
一般會員 發表:11 回覆:14 積分:5 註冊:2007-05-09 發送簡訊給我 |
感謝大大您的回復,您的意思是,我先用TStringList存入,再去解裡面的內容存到陣列中?(因為TStringList不能存二維)
這樣速度應該不會太慢,畢竟是記憶體在跑 --------------------------------- 暗黑破壞神版大回的char array[ ] ,我不太清楚是什麼意思? 看起來就只是宣告一個char陣列... ===================引 用 yorkland 文 章=================== 雖然TStringList是一維的, 但你存成CSV時, 每一個欄位會以逗號隔開。 前文提到Decode的意思, 就是去解每一行的內容填入你的"第二維"。 有人提到ADO, 這個我有用過, 速度也不錯, 不過好像要空下第一行, 為每一欄設定欄位名稱後才能正確連結。 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我也來插個花,我覺得用
ado 的方式(我也用過) 暗黑說的使用 char *p[ ] 或 int p[ ] 即讀時用ado,寫時用傳統的array container。這樣會快很多。 若xls裡放的其實是簡單的csv格式,那則用 c 裡的ifstream >> 複載子來把它寫入 array,這樣更快!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
用 ADO 的方式,透過 Jet Engine 開啟 Excel 當作資料庫時,第一列沒有欄位名稱也可以的
只要在連接字串中加上 Extended Properties="Excel 8.0; HDR=No" 就可以了 ===================引 用 yorkland 文 章=================== 有人提到ADO, 這個我有用過, 速度也不錯, 不過好像要空下第一行, 為每一欄設定欄位名稱後才能正確連結。
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/ |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
因為 TString, TStringList 這一類的 class 在使用時,是很方便.
不過.在記憶體配置上.為了要"通用性".....等等.會讓你多花一點時間去處理. 所以.你把這些回歸到陣列.指標.....去動作.會比用 class 去處理還要快很多. 當然.你的資料量不大時.沒必要這樣做. 就像泡泡排序法.在資料量少時.會比那些快速排序有效率一樣. 你要去看你要用的情況.選合適的方法. ===================引 用 chrislove87 文 章=================== 感謝大大您的回復,您的意思是,我先用TStringList存入,再去解裡面的內容存到陣列中?(因為TStringList不能存二維) 這樣速度應該不會太慢,畢竟是記憶體在跑 --------------------------------- 暗黑破壞神版大回的char array[ ] ,我不太清楚是什麼意思? 看起來就只是宣告一個char陣列... ===================引 用 yorkland 文 章=================== 雖然TStringList是一維的, 但你存成CSV時, 每一個欄位會以逗號隔開。 前文提到Decode的意思, 就是去解每一行的內容填入你的"第二維"。 有人提到ADO, 這個我有用過, 速度也不錯, 不過好像要空下第一行, 為每一欄設定欄位名稱後才能正確連結。 |
chrislove87
一般會員 發表:11 回覆:14 積分:5 註冊:2007-05-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |