SSIS使用条件拆分或脚本在flatfile中拆分行

时间:2017-06-02 14:50:18

标签: c# .net sql-server ssis etl

我是SSIS的新手,非常感谢您的想法或解决方案。

我有一个平面文件,第一行是文件详细信息(不是标题)。第二行以后是实际数据。

数据描述

第一行格式= Supplier_name,日期,文件中的记录数 例如:

  

Supplier_name ^ 06022017 ^ 3
  ID1 ^ Member1 ^ NEW YORK ^ 050117 ^ 50.00 ^ GENERAL ^ ANC   ID2 ^ ^ Member2佛罗里达^ 050517 ^ ^ 50.00 ^ MOBILE ANC   ID3 ^ ^ Member3西雅图^ 050517 ^ ^ 80.00 ^ MOBILE ANC
  EOF

问题

使用SSIS我想将第一行拆分为output1,将第二行拆分为output2。

在条件分割的帮助下,我想我能做到这一点。但是我不确定要分割行的条件是什么。我应该尝试多播吗?

由于

4 个答案:

答案 0 :(得分:3)

我会通过使用脚本任务(在数据流之前)来读取第一行并使用它执行任何操作来处理此问题。

然后在数据流任务中,我将平面文件源设置为忽略第一行并将第二行作为数据导入。

答案 1 :(得分:1)

谢谢大家。这是另一种解决方案

我在SSIS中使用了一个脚本组件来执行此操作。

Step1:创建一个名为RowNumber的变量。

Step2:然后添加一个脚本组件,该组件将添加一个额外的列并增加行号。

SSIS脚本组件

import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    onGenerateRoute: (RouteSettings settings) {
      if (settings.name == '/') {
        return new MaterialPageRoute<Null>(
          settings: settings,
          builder: (_) => new MyApp(),
          maintainState: false,
        );
      }
      return null;
    }
  ));
}

class MyApp extends StatefulWidget {
  MyAppState createState() => new MyAppState();
}

class MyAppState extends State<MyApp> with TickerProviderStateMixin {
  AnimationController _controller;

  @override
  void initState() {
    print("initState was called");
    _controller = new AnimationController(vsync: this)
      ..repeat(min: 0.0, max: 1.0, period: const Duration(seconds: 1))
      ..addListener(() {
        print('animation value ${_controller.value}');
      });
    super.initState();
  }

  @override
  void dispose() {
    print("dispose was called");
    _controller.dispose();
    super.dispose();
  }

  int _counter = 0;

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('home screen')
      ),
      body: new Center(
        child: new RaisedButton(
          onPressed: () {
            setState(() {
              _counter++;
            });
          },
          child: new Text('Button pressed $_counter times'),
        ),
      ),
      floatingActionButton: new FloatingActionButton(
        child: new Icon(Icons.remove_red_eye),
        onPressed: () {
          Navigator.push(context, new MaterialPageRoute(
            builder: (BuildContext context) {
              return new MySecondPage(counter: _counter);
            },
          ));
        },
      ),
    );
  }
}

class MySecondPage extends StatelessWidget {
  MySecondPage({ this.counter });

  final int counter;

  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Certificate of achievement'),
      ),
      body: new Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: [
          new Icon(Icons.developer_mode, size: 200.0),
          new Text(
            'Congrats, you clicked $counter times.',
            style: Theme.of(context).textTheme.title,
            textAlign: TextAlign.center,
          ),
          new Text(
            'All your progress has now been lost.',
            style: Theme.of(context).textTheme.subhead,
            textAlign: TextAlign.center,
          ),
        ],
      ),
    );
  }
}

Step3:使用Script组件的输出作为条件拆分的输入,并使用RowNumber == 1创建条件。

多播将相应地拆分数据。

enter image description here

答案 2 :(得分:0)

我首先要确保平面文件连接中的列数正确: 编辑平面文件连接 - &gt; “高级”选项卡按“新建”按钮添加列。在您的示例中,您应该有7,第0列到第6列。

现在添加一个条件拆分和两个案例语句:

Output Name      Condition
HeaderRow        [Column 0] == "Supplier_Name"
DetailRow        [Column 0] != "Supplier_Name"

现在将这些路由到输出1和输出2

答案 3 :(得分:0)

扩展Tab Allerman的答案。

对于我们的项目,我们在Execute process task中使用了一个power shell脚本组件,它运行一个简单的power shell命令来获取文件的第一行。

有关如何运行power shell脚本的信息,请参阅此MSDN blog

Power shell脚本获取第一行

Get-Content C:\foo\yourfolderpath\yourfilename.txt -First 1

此注释仅在与您相同的情况下有所帮助,但通常有助于避免处理具有错误标题的大文件(以GB和更高版本)。这个简单的电源shell在几毫秒内执行,而不是大多数进程/脚本需要将一个完整的文件加载到内存中,从而减慢了速度。