我是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。
在条件分割的帮助下,我想我能做到这一点。但是我不确定要分割行的条件是什么。我应该尝试多播吗?
由于
答案 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创建条件。
多播将相应地拆分数据。
答案 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在几毫秒内执行,而不是大多数进程/脚本需要将一个完整的文件加载到内存中,从而减慢了速度。