2017-03-02 99 views
-1

我有一個excel文件,我正在使用OleDB在我的C#程序中用SQL進行查詢。 但我面臨一個問題。我的文件有大約300K行,查詢需要很長時間。我已經搜索了這個問題,並使用了一些庫,如spreadsheetlight和EPPlus,但他們沒有查詢功能。 任何人都可以建議我最快的方式來查詢我的文件?C#查詢excel最快的方法

在此先感謝。

+0

你能說明你試過的代碼花了很長時間來處理嗎? – frostbyte

+0

@downvoters,這是來自OP的一個合理的問題!如果你曾經使用OleDB處理過300-400K行的Excel文件,你會知道的。甚至不需要代碼。至少當這樣的語句被執行時,它會很慢:'「SELECT * FROM [」+ sheetName +「$]」;' – andrews

+0

實際上查詢非常簡單。 (「SELECT [」+ date +「] FROM [Sheet1 $] WHERE [」+ key +「] =」+ array [i] .ToString(),connection); –

回答

1

我曾與400-800K行的Excel文件。任務是讀取所有行並將它們插入到SQL Server數據庫中。根據我的經驗,OleDB無法及時處理這些大文件,因此我們不得不使用SQL Server的方式直接將Excel文件導入到數據庫中。 OPENROWSET

甚至更​​小的文件,如260K行大約需要。一個小時的OleDB使用Core2 Duo生成硬件逐行導入數據庫表。

所以,你的情況,你可以考慮以下幾點:在塊

1.Try讀取Excel文件,使用範圍SELECT

OleDbCommand date = new OleDbCommand("SELECT ["+date+"] FROM [Sheet1$A1:Z10000] 
            WHERE ["+key+"]= " + array[i].ToString(), connection); 

注意,[Sheet1$A1:Z10000]告訴OLEDB只處理第一個10K行表格的A到Z列代替整個表格。如果您的Excel文件已排序,並且您知道不需要檢查所有行,但僅限於今年,則可以使用此方法。或者,您可以動態更改Z10000以讀取文件的下一個塊並將結果與​​前一個結合。

2.使用直接數據庫導入直接將所有Excel文件內容導入數據庫,例如MS SQL Server的OPENROWSET,然後針對RDBMS而不是Excel文件運行搜索查詢。

我個人建議選項#2。如果您可以使用數據庫,以及您可以使用的RDBMS產品/版本(如果有的話),請留言。

希望這會有所幫助!

+0

我非常感謝您的回答。這裏是細節。我正在撰寫一篇關於病人在3天內再次去醫院並進行研究的理由的論文。我有一年的醫院記錄,包括病人到醫院的日期和檔案有30萬行。首先,我通過patientID進行分組。然後,在for循環中,我爲每個單個患者ID調用select查詢,如下所示; 「從sheet1 where patientID = myarray [i]」中選擇日期。 (正如我在評論中提到的那樣)。通過這種方式,我可以爲每位患者提供所有到達日期,如果日期<3,我會檢查它。我沒有關於mssql unf的信息。 @andrews –

+0

@FK如果這是一次性活動,那麼最好的解決方案是首先在數據庫中獲取數據,然後用戶SQL對其進行查詢。否則,這將是一個痛苦。你以前曾經使用Relation Database Management Systems,MySQL,PostregSQL,SQL Server嗎?任何這些將爲你工作。 – andrews

+0

我以前使用過mysql。我想我會將所有的數據導出到MySQL數據庫。我怎樣才能將excel導出到mysql? –