私は SQL Server を使用していないため、一般的なガイダンスしか提供できません。
1)ファイルをデータベースにロードし、行全体を列にロードし、行の行番号を追加します。結果は次のようになります (rid
は行番号):
rid rline
1 1, 6997, 01234
2 2, 012345, 5678999, Y, 11, 20130301
3 2, 012345, 5678988, Y, 11, 20130301
4 1, 6647, 01234
5 2, 012345, 5678999, Y, 11, 20130301
6 2, 012345, 5678988, Y, 11, 20130301
2) SQL を使用して、必要な形式のデータを取得します。これは、2 の行ごとに 1 の最初の前の行を見つける必要があることを意味します。テストされていません:
select
csvdata.rline,
csvdata.rid,
(select rline from csvdata x where rline like '1,%' and x.rid < csvdata.rid order by x.rid desc limit 1) as TopRline
from
csvdata
where
rline like '2,%' -- this will limit lines to only those with the detail
うまくいけば、これにより 3 つの列で次の結果が生成されます。
rid rline TopRline
2 2, 012345, 5678999, Y, 11, 20130301 1, 6997, 01234
3 2, 012345, 5678988, Y, 11, 20130301 1, 6997, 01234
5 2, 012345, 5678999, Y, 11, 20130301 1, 6647, 01234
6 2, 012345, 5678988, Y, 11, 20130301 1, 6647, 01234
3) いくつかの SQL 関数を使用してデータを列に分割します (たとえば、PostgreSQL ではtext_to_array()
これを行います)。2 の結果がテーブル temp に格納されていると仮定すると、次のようになります。
select
(string_to_array(rline,','))[1] as column1,
(string_to_array(rline,','))[2] as column2,
(string_to_array(rline,','))[3] as column3,
(string_to_array(rline,','))[4] as column4,
(string_to_array(rline,','))[5] as column5,
(string_to_array(rline,','))[6] as column6,
(string_to_array(TopRline,','))[1] as column1top,
(string_to_array(TopRline,','))[2] as column2top,
(string_to_array(TopRline,','))[3] as column3top,
from
temp
4) 必要なテーブルにデータを保存します。