我创建了一个SSIS包,它使用ForEachLoop容器处理.CSV文件。
所有csv文件在最后一行包含“END OF FILE”。
如果最后一行中包含“END OF FILE”,则只处理这些CSV文件。
怎么做呢。请帮忙。
提前致谢。
答案 0 :(得分:2)
创建变量check
Name DataType Value
check int 0
假设您有一个类似下面的包装设计
脚本任务是检查End of File
last row
的文件
在脚本任务中,在check
部分添加变量ReadWriteVariable
,在ForEach container
中添加LoopFiles
的变量名称(假设变量名称为ReadOnlyVariables
)
在脚本任务中添加以下代码以读取文件。有几种方法可以读取文件here和here
public void Main()
{
int counter = 0;
string loop= Dts.Variables["User::LoopFiles"].Value.ToString();
string line;
using (StreamReader files = new StreamReader(file))
{
while((line = files.ReadLine()) != null)
{
if (line.ToLower() == "End Of File".ToLower())
{
Dts.Variables["User::check"].Value = 1;
}
}
}
Dts.TaskResult = (int)ScriptResults.Success;
}
双击绿色箭头连接脚本任务和数据流任务。将打开一个优先级对话框并输入如下表达式
答案 1 :(得分:0)
有很多方法可以做到这一点。一种方法是:
EOF_Found布尔
Row_Count Integer
答案 2 :(得分:0)
此解决方案可以避免逐行读取整个文件。为了完整起见,我在这里合并了Praveen的代码。
public void Main()
{
string line = ReadLastLine(@"c:\temp\EOF.cs");
if (line.ToUpper() == "END OF FILE")
{
Dts.Variables["User::check"].Value = 1;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
public static string ReadLastLine(string path)
{
StreamReader stream = new StreamReader(path);
string str = stream.ReadToEnd();
int i = str.LastIndexOf('\n');
string lastLine = str.Substring(i + 1);
return lastLine;
}