3

我有一个固定宽度的平面文件,需要加载到多个 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

有人可以帮我吗?

谢谢!

4

1 回答 1

1

我会先听取@bilinkc 给出的建议,然后尝试通过反透视来解决这个问题。

单击此处了解有关如何使用 SSIS Unpivot 数据流转换的详细信息。

但是,如果由于某种原因无法解决,而您真的想用 SSIS 解决这个问题,我(有点)高兴地说,使用 SSIS 和一个数据流解决问题在技术上是可行的。

以下是步骤的简短列表:

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

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

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

4) 向您的数据流任务添加多播数据流转换

5) 将您的平面文件源与多播数据流转换连接



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

6) 将 30 个条件拆分数据流转换添加到您的数据流任务中

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

8)配置每个Conditional Split N,拉取State N和City N有值的行子集

示例:条件拆分 1

输出名称:CTY1_ST1

条件:[CTY1] != "" && [ST1] != ""

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

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

11) 使用派生列名称 SEQ 和值 1 到 30 配置每个

12)添加一个联合所有数据流转换和联合所有30个数据管道回到一起



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

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

14) 将第 31 个多播管道连接到您的第一个排序转换

15)在ID旁边打勾并按ID排序(希望ID:NAME和ID:AGE是1:1)

16) 检查删除具有重复排序值的行

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

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

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

20) 为您的数据流任务添加合并连接

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

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

23) 将您的合并联接配置为联接类型 = 内部联接并选择列 ID、SEQ、CTY、ST

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

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

于 2013-12-15T04:30:03.730 回答