2012-07-04 80 views
0

我有一個CSV數據的大集合,它是由我希望存儲在數據庫(最好是SQL Server)中的應用程序創建的。這些數據可以具有任意數量的列和任意數量的行,並將每個行存儲爲單獨的表格沒有太大意義。能夠蒐集這些數據也很棒。將這些數據放入數據庫的最佳方式是什麼?在數據庫中存儲變量行/列CSV文件

比如(和我在這裏大大簡化的東西),只考慮3可能看起來像CSV文件:

File 1: 
aaa,bbb,ccc 
ddd,eee,fff 
ggg,hhh,iii 

File 2: 
jjj,kkk 
lll,mmm 

File 3: 
nnn,ooo,ppp,qqq,rrr 
sss,ttt,uuu,vvv,www 
xxx,yyy,zzz,111,222 
333,444,555,666,777 

我可能是在簡化這一點,但我不能發表由於嚴格的實際數據NDA。

如何將它存儲在數據庫中最好?將會有成千上萬的文件,每個文件在理論上可以通過不同的列寬和不同的行數來實現。

編輯: 數據集市是否可以用來實現這一點,如果是這樣的話?任何指針?

+0

˚F或每個這些導入的文件,是否有一個id列,並且您可能認爲所有其他列都是該對象的屬性?在這種情況下,你可能會考慮所謂的「財產袋」表。但是,用於這種「通用」表的用途非常有限,只能在約束條件清晰的情況下考慮。 http://www.sswug.org/articles/viewarticle.aspx?id=25942 –

回答

1

對於每個文件在「csv文件」表中創建一個記錄。

對於每個列名,在具有相應列索引的「csv文件頭名稱」表中創建一條記錄。

對於每個csv行,創建一個鍵值hashmap,其中'key'是'列索引','value'是'行'數據。將此散列圖序列化爲XML字符串,然後將此XML存儲在「csv文件數據」表XML列中。

然後,您可以使用XPath來選擇XML行數據加入「列索引」列以檢索原始文件列標題。

編輯:

CSVFile 
PK FilePath 
... 
7 [\\server1\somedir\foo.csv] 
9 [\\server1\dir\bar.csv] 
... 

CSVFileColumnHeader 
PK FileId ColumnIndex ColumnName 
... 
980 7  5   [foo quant] 
981 7  6   [foo size] 
982 9  3   [bar depth] 
.. 

CSVFileRowData 
PK  FileId RowIndex RowDataAsXML 
.. 
1054 7  35   <ArrayOfSerialisableKeyValuePair>...<SerialisableKeyValuePair><Key>5</Key><Value>17</Value></SerialisableKeyValuePair><SerialisableKeyValuePair><Key>6</Key><Value>8cm</Value></SerialisableKeyValuePair>...</ArrayOfSerialisableKeyValuePair> 
1055 7  36   <ArrayOfSerialisableKeyValuePair>...<SerialisableKeyValuePair><Key>5</Key><Value>8</Value></SerialisableKeyValuePair><SerialisableKeyValuePair><Key>6</Key><Value>35cm</Value></SerialisableKeyValuePair>...</ArrayOfSerialisableKeyValuePair> 
1056 9  4   <ArrayOfSerialisableKeyValuePair>...<SerialisableKeyValuePair><Key>3</Key><Value>4 metres</Value></SerialisableKeyValuePair>...</ArrayOfSerialisableKeyValuePair> 
... 

然後XPath查詢這樣的:

SELECT 
    CFR.FileId          'FileId' 
    ,tab.col.value('./Key[1]', 'INT')    'ColumnIndex' 
    ,CFR.RowIndex         'RowIndex' 
    ,tab.col.value('./Value[1]', 'VARCHAR(250)') 'RowValue' 
    ,CFC.ColumnName         'ColumnName' 
FROM 
      CSVFileRowData CFR 
CROSS APPLY RowDataAsXML.nodes('//SerialisableKeyValuePair')tab(col) 
INNER JOIN CSVFileColumnHeader CFC ON tab.col.value('./Key[1]', 'INT') = CFC.ColumnIndex 

會用此格式返回數據:

FileId ColumnIndex RowIndex RowValue  ColumnName 
... 
7  5   35   [17]   [foo quant] 
7  6   35   [8cm]   [foo size] 
.. 
+0

聽起來很有意思,但我無法理解你的建議。有沒有可以鏈接到的例子?最好用圖表。 – Jonnster

+0

謝謝。看起來非常有前途(除了我沒有任何文件的專欄名稱)。 – Jonnster

+0

然後,我可以將這些數據選擇到ADO記錄集中嗎? – Jonnster