我有一个固定宽度的平面文件,需要加载到多个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
有人可以帮我吗?
谢谢!
最佳答案
我会首先听取@bilinkc 给出的建议,并尝试通过 unpivot 解决这个问题。
Click here了解有关如何使用 SSIS Unpivot 数据流转换的详细信息。
但是,如果由于某种原因这不起作用,并且您确实想使用 SSIS 解决这个问题,我(有点)很高兴地说,使用 SSIS 和一个数据流解决该问题在技术上是可行的。
以下是步骤的缩写列表:
1) 将数据流任务添加到您的包中
2) 将平面文件源添加到数据流任务
3) 使用连接管理器为平面文件配置平面文件源
4) 将多播数据流转换添加到您的数据流任务
5) 将平面文件源与多播数据流转换连接
现在是“有趣”的部分(复制和粘贴可以节省您的时间)...
6) 将 30 个条件拆分数据流转换添加到您的数据流任务
7) 将多播数据流转换连接到每个条件拆分数据流
8) 配置每个条件拆分 N 以提取其中 State N 和 City N 具有值的行子集
示例:条件拆分 1
输出名称:CTY1_ST1
条件:[CTY1] != ""&& [ST1] != ""
9) 将 30 个派生列数据流转换添加到您的数据流
10) 将每一个连接到您的 30 个条件拆分
11) 为每个配置派生列名称 SEQ 和值 1 到 30
12) 添加 Union All 数据流转换并将 30 个数据管道重新合并在一起
现在是“简单”部分......
13) 将您的第一个排序转换添加到数据流任务中
14) 将第 31 个多播管道连接到您的第一个排序转换
15) 在旁边打勾并按 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 目标添加到数据流中并将合并联接连接到它(结果为表 2)
25) 将第二个 OLE DB 目标添加到数据流并将第二个多播数据流转换连接到它(结果为表 1)
关于sql - 在SSIS中将固定宽度的行拆分为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15736108/