我创建了一个 SSIS 包,它使用 ForEachLoop 容器处理 .CSV 文件。
所有 csv 文件的最后一行都包含“END OF FILE”。
只有那些在最后一行包含“END OF FILE”的 CSV 文件才会被处理。
怎么做到呢。请帮忙。
提前致谢。
我创建了一个 SSIS 包,它使用 ForEachLoop 容器处理 .CSV 文件。
所有 csv 文件的最后一行都包含“END OF FILE”。
只有那些在最后一行包含“END OF FILE”的 CSV 文件才会被处理。
怎么做到呢。请帮忙。
提前致谢。
创建变量check
Name DataType Value
check int 0
假设您有一个如下所示的包装设计
脚本任务是检查End of File
在last row
在脚本任务中添加变量check
inReadWriteVariable
部分和输出变量 from ForEach container
(假设变量名称是LoopFiles
) inReadOnlyVariables
在脚本任务中添加以下代码来读取文件。有几种方法可以在这里和这里读取文件
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;
}
双击绿色箭头连接脚本任务和数据流任务。将打开一个优先对话框并输入如下表达式
有多种方法可以做到这一点。一种方法是:
EOF_Found 布尔值
Row_Count 整数
该解决方案避免了逐行读取整个文件。为了完整起见,我在这里合并了 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;
}