2014-07-02 183 views
0

我試過研究這個問題,但大多數答案是.csv文件,這對我沒有多大幫助。插入數據文件到SQL Server數據庫(無分隔符)

我有一對包含大量數據(每個文件大約700MB)的大型文件.dat,我試圖在C#中開發一個軟件,我將能夠搜索特定的字符串並找到行它在哪裏(重複將發生,所以列表視圖/列表框可能是一個好主意)。

每行都遵循完全相同的數據格式,並且每個數據類型的起始索引/長度都有詳細記錄。

例子:

線路1:ZATIXIZ20SWEDENSTACKOVERFLOWCHROME

記錄在案這樣的:

用戶名:0-6
年齡:7-8
國家:9-14
網站: 15-27
瀏覽器:28-33

我的猜測是最好的方法是對數據文件進行一些BULK INSERT操作,然後將其編入索引以便稍後進行更快速的搜索。我不太清楚如何做到這一點,也不是最好的方法。 (它也需要搜索所有的文件,所以也許這是一個好主意,將它們全部插入到同一個表中)

到目前爲止,我只試過將其中一個文件讀入內存,然後執行一個簡單的正則表達式當然不是一個好主意。不幸的是,我對SQL查詢有點缺乏經驗,這就是爲什麼我還沒有嘗試過很多。

在此先感謝!

回答

0

'將所有相同類型的數據插入帶有索引列的表格中。

如果每個文件的屬性不同,請使用多個表。

如果你希望能夠追蹤比賽回到原來的文件,請使用列的表:

  • 關鍵 - 內部鍵從序列
  • 文件名 - 所以,你知道它是從哪裏來從
  • 線 - 行號
  • 用戶名
  • 年齡
  • 國家
  • 網站
  • 瀏覽器

如果文件名,行是一個獨特的密鑰。

下面是一篇文章的鏈接上全文搜索上MSSQL,因爲我們不知道你正在使用的關係數據庫管理系統:http://msdn.microsoft.com/en-us/library/ms142571.aspx#queries

從你的例子,行「ZATIXIZ20SWEDENSTACKOVERFLOWCHROME」變爲:

| Key | FileName | Line | Username | Age | CountryKey | Website   | BrowserKey 
    1 'Data1.dat'  1 'ZATIXIZ' 20   46  'STACKOVERFLOW'   4 

在這個例子中,你需要兩個表:國家和瀏覽器。這些是可選的,因爲您可以直接在主表中包含信息。

但是我必須強調,這實際上取決於您希望如何查詢這些數據。上述結構使您通過執行以下查詢搜索「20和25)之間的所有瑞典用戶的機會:

select * from TABLENAME where Age < 25 and Age >= 20 and CountryKey = 46 

在問候你如何導入固定寬度的文件,這在很大程度上取決於你的關係數據庫管理系統。如果您使用的是Oracle,則可以使用SQL*Loader。請記住,它不一定是一個單一階段的過程。您可以將數據加載到表中,然後在初始導入後在內部查找密鑰。

對於MSSQL,這裏是從堆棧中另一個答案:Bulk insert fixed width fields

也可以是進行預處理的.NET。再次,這取決於你的情況。如果您每10分鐘以900MB文件的速度將這些文件傳輸到系統中,那麼您正在考慮批量加載過程(以及一些嚴重硬件)的一些嚴重優化。但是如果你只需要每月加載這個文件一次,那麼.NET方法是絕對沒問題的,儘管可能需要幾個小時。

+0

謝謝你的解答Troels Larsen。我會看看這篇文章,並確保添加你提到的額外的列,我不太清楚我將如何插入所有行,指定數據在行上的位置(即「網站」從15開始到27),你能舉一個例子嗎? (我可以在c#中完成,但我無法做的只是使用SQL查詢)謝謝! –

+0

我已經添加了一個例子,希望澄清它。 –

+0

非常感謝Troels。我不知道它被稱爲「固定寬度」。對不起,我忘了提及我更新了我的問題。我正在使用MSSQL。 –

相關問題