4

データベース、できれば 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 のため、実際のデータを投稿することはできません。

これをデータベースに保存するにはどうすればよいでしょうか。理論的には、列幅と行数が異なる数千のファイルが存在します。

編集:これを達成するためにデータマートを使用できますか? ポインタはありますか?

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 に答える