線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:8744
推到 Plurk!
推到 Facebook!

如何更有效率的把EXCEL所有欄位讀入記憶體

答題得分者是:yorkland
chrislove87
一般會員


發表:11
回覆:14
積分:5
註冊:2007-05-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-05 09:24:54 IP:192.192.xxx.xxx 訂閱
我的EXCEL資料 有13000筆 每筆23個欄位

要將它們全數讀到記憶體內做運算

但是光讀入記憶體就要花十幾二十分鐘(視CPU而定)

我是存到AnsiString陣列,使用ole元件來讀EXCEL

不知道有沒有更有效率的方法呢?
yorkland
高階會員


發表:2
回覆:138
積分:108
註冊:2004-12-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-05 14:13:38 IP:60.250.xxx.xxx 訂閱
如果是以CELL一格一格讀進來的方式, 那速度肯定不理想。
但透過OLE一次讀入一個Array, 速度好像也快不到那裡。
我的作法如下:
1. 先把Excel匯出至文字檔(CSV或TXT...)。
2. 以TStringList.LoadFromFile()載入這個文字檔, 然後再一行一行Decode文字內容。
我想這個速度可能會好一些。
你參考看看...
2007
中階會員


發表:54
回覆:90
積分:98
註冊:2008-08-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-05 14:23:09 IP:220.132.xxx.xxx 未訂閱

用 ado元件 會不會比較快!!

ps:沒試過

===================引 用 chrislove87 文 章===================
我的EXCEL資料 有13000筆 每筆23個欄位

要將它們全數讀到記憶體內做運算

但是光讀入記憶體就要花十幾二十分鐘(視CPU而定)

我是存到AnsiString陣列,使用ole元件來讀EXCEL

不知道有沒有更有效率的方法呢?
chrislove87
一般會員


發表:11
回覆:14
積分:5
註冊:2007-05-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-05 18:34:09 IP:59.125.xxx.xxx 訂閱

===================引 用 yorkland 文 章===================
如果是以CELL一格一格讀進來的方式, 那速度肯定不理想。
但透過OLE一次讀入一個Array, 速度好像也快不到那裡。
我的作法如下:
1. 先把Excel匯出至文字檔(CSV或TXT...)。
2. 以TStringList.LoadFromFile()載入這個文字檔, 然後再一行一行Decode文字內容。
我想這個速度可能會好一些。
你參考看看...


感謝您提供的方法!速度果然好很多!
不過經過測試發現,我的Excel資料是二維的,
而TStringList似乎是一維的?
還有沒有其他的辦法也能這麼快呢?
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-05 19:04:21 IP:122.118.xxx.xxx 未訂閱
要再快就要把 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-05 21:49:03 IP:61.59.xxx.xxx 訂閱
雖然TStringList是一維的, 但你存成CSV時, 每一個欄位會以逗號隔開。
前文提到Decode的意思, 就是去解每一行的內容填入你的"第二維"。
有人提到ADO, 這個我有用過, 速度也不錯, 不過好像要空下第一行, 為每一欄設定欄位名稱後才能正確連結。

chrislove87
一般會員


發表:11
回覆:14
積分:5
註冊:2007-05-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-05 23:51:22 IP:59.125.xxx.xxx 訂閱
感謝大大您的回復,您的意思是,我先用TStringList存入,再去解裡面的內容存到陣列中?(因為TStringList不能存二維)

這樣速度應該不會太慢,畢竟是記憶體在跑

---------------------------------
暗黑破壞神版大回的char array[ ] ,我不太清楚是什麼意思?

看起來就只是宣告一個char陣列...


===================引 用 yorkland 文 章===================
雖然TStringList是一維的, 但你存成CSV時, 每一個欄位會以逗號隔開。
前文提到Decode的意思, 就是去解每一行的內容填入你的"第二維"。
有人提到ADO, 這個我有用過, 速度也不錯, 不過好像要空下第一行, 為每一欄設定欄位名稱後才能正確連結。

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-06 04:24:07 IP:59.115.xxx.xxx 訂閱
我也來插個花,我覺得用

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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-06 20:08:25 IP:124.10.xxx.xxx 訂閱
用 ADO 的方式,透過 Jet Engine 開啟 Excel 當作資料庫時,第一列沒有欄位名稱也可以的
只要在連接字串中加上 Extended Properties="Excel 8.0; HDR=No" 就可以了

===================引 用 yorkland 文 章===================
有人提到ADO, 這個我有用過, 速度也不錯, 不過好像要空下第一行, 為每一欄設定欄位名稱後才能正確連結。
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2008-11-06 20:09:16, 註解 無‧
sryang 重新編輯於 2008-11-06 20:09:37, 註解 無‧
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-11-06 22:14:21 IP:122.118.xxx.xxx 未訂閱
因為 TString, TStringList 這一類的 class 在使用時,是很方便.
不過.在記憶體配置上.為了要"通用性".....等等.會讓你多花一點時間去處理.
所以.你把這些回歸到陣列.指標.....去動作.會比用 class 去處理還要快很多.
當然.你的資料量不大時.沒必要這樣做.
就像泡泡排序法.在資料量少時.會比那些快速排序有效率一樣.
你要去看你要用的情況.選合適的方法.

===================引 用 chrislove87 文 章===================
感謝大大您的回復,您的意思是,我先用TStringList存入,再去解裡面的內容存到陣列中?(因為TStringList不能存二維)

這樣速度應該不會太慢,畢竟是記憶體在跑

---------------------------------
暗黑破壞神版大回的char array[ ] ,我不太清楚是什麼意思?

看起來就只是宣告一個char陣列...


===================引 用 yorkland 文 章===================
雖然TStringList是一維的, 但你存成CSV時, 每一個欄位會以逗號隔開。
前文提到Decode的意思, 就是去解每一行的內容填入你的"第二維"。
有人提到ADO, 這個我有用過, 速度也不錯, 不過好像要空下第一行, 為每一欄設定欄位名稱後才能正確連結。

chrislove87
一般會員


發表:11
回覆:14
積分:5
註冊:2007-05-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-11-07 09:45:07 IP:59.125.xxx.xxx 訂閱
感謝各位大大的回覆

小弟已完成這部份的code

由於回文人太多 加上我是使用yorkland 的方法

故得分的人選擇他

再次感謝各位的幫忙~感恩
系統時間:2024-05-05 18:55:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!