4

我有大量由应用程序创建的 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

我可能过于简化了,但由于严格的保密协议,我无法发布实际数据。

最好将它存储在数据库中吗?将有数千个文件,每个文件理论上可以具有不同的列宽和不同的行数。

编辑:可以使用数据集市来实现这一目标吗?如果可以,如何实现?任何指针?

4

1 回答 1

1

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

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

为每个 csv 行创建一个键值哈希图,其中“键”是“列索引”,“值”是“行”数据。将此哈希映射序列化为 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]
..
于 2012-07-04T11:49:37.070 回答