代码之家  ›  专栏  ›  技术社区  ›  Hadrian

使用SSI的ConvertRowsTocolumns

  •  0
  • Hadrian  · 技术社区  · 6 年前

    我必须从平面文件中提取数据并加载到临时数据库中

    我有一个没有列标题的平面文件,我想把每一行放在一个单独的列中 文本文件数据:这是实际格式

    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
    

    条件: 左(列,2)=01放入一列,左(列,02)放入另一列。。等等 我必须阅读多个这样的平面文件。列名类似于column01、column02、column51。在这种情况下,01仍然是任何多行的主列。我需要循环浏览至少100个这样的文件。

    样本输出

    Col01                          col2                                                Col3
    01008012603181700250318        02010691700001988800000000000000000000000       51X11055907014X10000002200000000220000000003671100000000001124000000002110559070145
    

    更新1:正如@Tab Alleman所建议的,我已经将所有文本加载到SQL表的一列中。我已尝试按拆分行 string_split 函数,无法实现结果。分隔符是一个空格,但某些行数据有多个空格。我还尝试在堆栈中创建string\u split函数。

    前任: 01594022603181352250318 02027061352002288200000000000000000000000 112997232009865 01 51X06082082020X10000000600000000054000000000900600000000000601000000002060820820200 56-00000006012 00 112997232009865 01

    2 回复  |  直到 6 年前
        1
  •  1
  •   Tab Alleman    6 年前

    如果确实希望整个文件只生成一行,则只需将CRLF字符(或文件的行终止符字符)设置为平面文件连接中的列分隔符。文件的每一行都将是数据流中的一列。

        2
  •  0
  •   KeithL    6 年前

    我有一个脚本任务可以帮助你。但它有几个步骤

    1. 将数据加载到列名称数据中。

    2. 添加脚本组件转换

    3. 在“输入”选项卡上-选择数据为只读
    4. 在输入/输出上添加您期望的输出Col1、Col2、。。。我把它们都设置为varchar(500)
    5. 添加以下脚本(C#)

    int rn=0;

    字符串Col1;

    字符串Col2;

    字符串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;
            }
        }
    
    }
    

    请注意以下事项:

    1. 变量在ProcessInputRow脚本外部声明
    2. 读取最后一行时将创建新行。
    3. 我无法使变量在格式中显示为代码。
    4. 您需要将所有列添加到输出、变量声明和开关中。