我有一大堆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,我无法发布实际数据。
如何将其存储在数据库中?将有数千个文件,理论上可以通过不同的列宽和不同的行数。
修改: 是否可以使用数据集市来实现这一目标,如果是这样的话?有什么指针吗?
答案 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]
..