阅读平面文件与不均匀的没有。列

时间:2013-03-28 06:32:14

标签: sql ssis etl

我有一个像这样的csv文件

**0, xyz, 20130301121212
1, 6997, 01234
2, 012345, 5678999, Y, 11, 20130301
2, 012345, 5678988, Y, 11, 20130301
1, 6647, 01234
2, 012345, 5678999, Y, 11, 20130301
2, 012345, 5678988, Y, 11, 20130301
9, 8**

0行是标题,1是不同的商店,2是产品的详细记录

带有2的行(作为第一列)是具有第1行(作为第一列)的商店的详细信息

有些人可以告诉我如何将这些行与2的分组与相应的1的

分组

2 个答案:

答案 0 :(得分:0)

我没有使用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来获取所需形状的数据。这意味着您必须找到第一个前一行,每行包含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

希望这会产生以下三列结果:

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)将数据存储在您想要的任何表格中。

答案 1 :(得分:0)

注意到SSIS在锯齿状CSV方面的困难,我会在SSIS运行的CMD中做一些预先工作,因此您可以使用标准的CSV功能。加载到两个单独的表,然后只加入共享键列上的表。

首先将锯齿状文件中的行拆分为非锯齿状文件。在Windows中,类似下面的东西应该可以解决问题。

findstr /b "1," InputFile.txt > InputFileRow_1.txt
findstr /b "2," InputFile.txt > InputFileRow_2.txt

然后使用SSIS标准CSV功能将InputFileRow_1.txt和InputFileRow_2.txt加载到表InputFileRow_1和InputFileRow_2表中。

最后,类似下面的内容。

 SELECT *
 FROM InputFileRow_1 ifr1
 INNER JOIN InputFileRow_2 ifr2
 ON ifr1.RowType2_ID = ifr2.RowType2_ID

*根据文件中行类型的分布和文件大小,此方法可能会从IO角度看起来很浪费。