ConvertRowsTocolumns 使用 SSIS
ConvertRowsTocolumns Using SSIS
我必须从平面文件中提取数据并加载到登台数据库中
ex:我有这个没有列 header 的平面文件,我想将每一行放入一个单独的列中
文本文件数据:这是实际格式
01008012603181700250318
02010691700001988800000000000000000000000
51X11055907014X10000002200000000220000000003671100000000001124000000002110559070145
51X61630051007X10000000005000000000500000000016100000000009999000000002616300510071
60350000002205000000000002
02010691713001988900000000000000000000000
51X08042508025X10000001000000000100000000001670800000000000806000000002080425080250
51X08040547025X10000001000000000100000000001670800000000000806000000002080405470255
60350000002000000000000002
02011511724001989000000000000000000000000
112997241682493 01
51X08066360013X10000002200000000170000000002830800000000000806000000002080663600135
53-00000050098234151 00
112997241682493 01
51X08061643013X10000001500000000150000000002500800000000000806000000002080616430130
683000000000000000000000000
60350000003200000000000002
01008022603181734250318
160206917349000002B26031802
6724-000004400000000000002
320206917340201Y180326
3301000005321500000532150000000000000000000002
条件:
left (col,2) = 01 进入一列,left(col,02) 进入另一列..等等
我必须像这样通读多个平面文件。列名类似于 column01、column02、column51。在这种情况下,01 仍然是任何多行的主列。我需要像这样遍历至少 100 个文件。
示例输出
Col01 col2 Col3
01008012603181700250318 02010691700001988800000000000000000000000 51X11055907014X10000002200000000220000000003671100000000001124000000002110559070145
更新 1:按照@Tab Alleman 的建议,我已将所有文本加载到 SQL table 中的单列中。我曾尝试通过 string_split
函数拆分行,但无法获得结果。分隔符是一个space,但有些行数据有多个space。我也尝试过创建 string_split 函数发布在堆栈中。
例如:01594022603181352250318 02027061352002288200000000000000000000000 112997232009865 01 51X06082082020X10000000600000000054000000000900600000000000601000000002060820820200 56-00000006012 00 112997232009865 01
如果您真的希望整个文件只生成一行,您只需将 CRLF 字符(或任何文件的行终止符)设置为平面文件连接中的列定界符。文件的每一行都将成为数据流中的一列。
我有一个脚本任务可以帮助你。虽然它有几个步骤
将您的数据加载到列名数据中。
添加脚本组件转换
- 在输入选项卡上 - Select 数据为只读
- 在 input/output 上添加您期望的输出 Col1、Col2... 我将它们全部设置为 varchar(500)
- 添加以下脚本 (C#)
int rn = 0;
字符串 Col1;
字符串列 2;
字符串 Col3;
字符串 Col4;
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
rn++;
Col1 = Row.data;
while (Row.NextRow())
{
rn++;
switch (rn)
{
case 2:
Col2 = Row.data;
break;
case 3:
Col3 = Row.data;
break;
case 4:
Col4 = Row.data;
//Add transposed data on last row
FlippedBuffer.AddRow();
FlippedBuffer.Col01 = Col1;
FlippedBuffer.Col2 = Col2;
FlippedBuffer.Col3 = Col3;
FlippedBuffer.Col4 = Col4;
break;
}
}
}
注意以下几点:
- 变量在 ProcessInputRow 脚本之外声明
- 读取最后一行时创建新行。
- 我无法让变量在格式设置中显示为代码。
- 您需要将所有列添加到输出、变量声明和开关中。
我必须从平面文件中提取数据并加载到登台数据库中
ex:我有这个没有列 header 的平面文件,我想将每一行放入一个单独的列中 文本文件数据:这是实际格式
01008012603181700250318
02010691700001988800000000000000000000000
51X11055907014X10000002200000000220000000003671100000000001124000000002110559070145
51X61630051007X10000000005000000000500000000016100000000009999000000002616300510071
60350000002205000000000002
02010691713001988900000000000000000000000
51X08042508025X10000001000000000100000000001670800000000000806000000002080425080250
51X08040547025X10000001000000000100000000001670800000000000806000000002080405470255
60350000002000000000000002
02011511724001989000000000000000000000000
112997241682493 01
51X08066360013X10000002200000000170000000002830800000000000806000000002080663600135
53-00000050098234151 00
112997241682493 01
51X08061643013X10000001500000000150000000002500800000000000806000000002080616430130
683000000000000000000000000
60350000003200000000000002
01008022603181734250318
160206917349000002B26031802
6724-000004400000000000002
320206917340201Y180326
3301000005321500000532150000000000000000000002
条件: left (col,2) = 01 进入一列,left(col,02) 进入另一列..等等 我必须像这样通读多个平面文件。列名类似于 column01、column02、column51。在这种情况下,01 仍然是任何多行的主列。我需要像这样遍历至少 100 个文件。
示例输出
Col01 col2 Col3
01008012603181700250318 02010691700001988800000000000000000000000 51X11055907014X10000002200000000220000000003671100000000001124000000002110559070145
更新 1:按照@Tab Alleman 的建议,我已将所有文本加载到 SQL table 中的单列中。我曾尝试通过 string_split
函数拆分行,但无法获得结果。分隔符是一个space,但有些行数据有多个space。我也尝试过创建 string_split 函数发布在堆栈中。
例如:01594022603181352250318 02027061352002288200000000000000000000000 112997232009865 01 51X06082082020X10000000600000000054000000000900600000000000601000000002060820820200 56-00000006012 00 112997232009865 01
如果您真的希望整个文件只生成一行,您只需将 CRLF 字符(或任何文件的行终止符)设置为平面文件连接中的列定界符。文件的每一行都将成为数据流中的一列。
我有一个脚本任务可以帮助你。虽然它有几个步骤
将您的数据加载到列名数据中。
添加脚本组件转换
- 在输入选项卡上 - Select 数据为只读
- 在 input/output 上添加您期望的输出 Col1、Col2... 我将它们全部设置为 varchar(500)
- 添加以下脚本 (C#)
int rn = 0;
字符串 Col1;
字符串列 2;
字符串 Col3;
字符串 Col4;
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
rn++;
Col1 = Row.data;
while (Row.NextRow())
{
rn++;
switch (rn)
{
case 2:
Col2 = Row.data;
break;
case 3:
Col3 = Row.data;
break;
case 4:
Col4 = Row.data;
//Add transposed data on last row
FlippedBuffer.AddRow();
FlippedBuffer.Col01 = Col1;
FlippedBuffer.Col2 = Col2;
FlippedBuffer.Col3 = Col3;
FlippedBuffer.Col4 = Col4;
break;
}
}
}
注意以下几点:
- 变量在 ProcessInputRow 脚本之外声明
- 读取最后一行时创建新行。
- 我无法让变量在格式设置中显示为代码。
- 您需要将所有列添加到输出、变量声明和开关中。