在SSIS中将固定宽度行拆分为多行

时间:2013-04-01 00:21:03

标签: sql oracle ssis

我有一个固定宽度的平面文件,需要加载到多个oracle表中(一行需要拆分成多行)

每列顶部的数字是它们的大小, 我想要的输出应该如下所示。

Flatfile data(fixed width):
3   6    3   11          3   10        3   10        3
ID NAME  AGE CTY1       ST1 CTY2      ST2 CTY3      ST3
200JOHN  46  LOSANGELES CA  HOUSTON   TX  CHARLOTTE NC
201TIMBER54  PHOENIX    AZ                CHICAGO   IL
202DAVID 32  ATLANTA    GA  PORTLAND  AZ

事件可能会有所不同......它可能会增长到20-30

DESIRED OUTPUT:
TABLE1
ID NAME  AGE
200JOHN  46
201TIMBER54
202DAVID 32


TABLE2
ID  SEQ CTY        ST
200 1   LOSANGELES CA  
200 2   HOUSTON    TX  
200 3   CHARLOTTE  NC
201 1   PHOENIX    AZ      
201 2   CHICAGO    IL        
202 1   ATLANTA    GA  
202 2   PORTLAND   AZ

有人可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我会首先听取@bilinkc给出的建议并尝试用一个非透明的方式来解决这个问题。

Click here有关如何使用SSIS Unpivot数据流转换的详细信息。

但是,如果由于某种原因无法解决这个问题并且你真的想用SSIS来解决这个问题,那么我很高兴地说使用SSIS和一个数据流解决问题在技术上是可行的。

以下是步骤的简略列表:

1)将数据流任务添加到包中

2)将平面文件源添加到数据流任务

3)使用连接管理器为平面文件配置平面文件源

4)将多播数据流转换添加到数据流任务

5)使用多播数据流转换连接平面文件源



现在“有趣”的部分(复制和粘贴可以节省你的时间)......

6)向数据流任务添加30条条件拆分数据流转换

7)将多播数据流转换连接到每个条件分割数据流

8)配置每个条件分割N以拉出状态N和城市N具有值

的行子集

示例:条件分割1

输出名称:CTY1_ST1

条件:[CTY1]!=“”&& [ST1]!=“”

9)将30个派生列数据流转换添加到数据流

10)将每个连接到30条条件拆分

11)使用派生列名称SEQ和值1到30

配置每个

12)添加Union All Data Flow Transformation和Union所有30个数据管道重新组合



现在是“简单”的部分......

13)将您的第一个排序转换添加到您的数据流任务

14)将第31个多播管道连接到第一个分类转换

15)在旁边放一个复选标记并按ID排序(希望ID:NAME和ID:AGE是1:1)

16)选中删除具有重复排序值的行

17)添加第二个多播数据流转换

18)向数据流任务添加第二个排序转换

19)将您的Union All连接到第二个Sort Transformation并按ID排序

20)向数据流任务添加合并连接

21)将第二个多播数据流转换连接为左输入

22)将您的第二个排序转换连接到合并加入作为您的右输入

23)将合并连接配置为连接类型=内连接并选择列ID,SEQ,CTY,ST

24)将您的第一个OLE DB目标添加到您的数据流并将Merge Join连接到它(结果是TABLE2)

25)向数据流添加第二个OLE DB目标,并将第二个多播数据流转换连接到它(结果为TABLE1)