在数据库中存储可变行/列CSV文件

时间:2012-07-04 10:59:08

标签: sql-server csv

我有一大堆CSV数据,由我希望存储在数据库(最好是SQL Server)中的应用程序创建。此数据可以包含任意数量的列和任意数量的行,并将每个行存储为单独的表格没有多大意义。能够对这些数据进行处理也很棒。将这些数据放入数据库的最佳方法是什么。

例如(我在这里大大简化了一些事情),只考虑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,我无法发布实际数据。

如何将其存储在数据库中?将有数千个文件,理论上可以通过不同的列宽和不同的行数。

修改: 是否可以使用数据集市来实现这一目标,如果是这样的话?有什么指针吗?

1 个答案:

答案 0 :(得分:1)

对于每个文件,在“csv文件”表中创建一条记录。

对于每个column-name,在“csv文件头名称”表中创建一个带有相应列索引的记录。

对于每个csv行,创建一个键值hashmap,其中'key'是'column index','value'是'row'数据。将此hashmap序列化为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]
..