Sql server 2008 如何在ssis中处理csv文件之前检查该文件的结尾
我创建了一个SSIS包,它使用ForEachLoop容器处理.CSV文件 所有csv文件的最后一行都包含“文件结束” 如果最后一行包含“文件结束”,则仅处理这些CSV文件 怎样才能做到呢。请帮忙Sql server 2008 如何在ssis中处理csv文件之前检查该文件的结尾,sql-server-2008,ssis,Sql Server 2008,Ssis,我创建了一个SSIS包,它使用ForEachLoop容器处理.CSV文件 所有csv文件的最后一行都包含“文件结束” 如果最后一行包含“文件结束”,则仅处理这些CSV文件 怎样才能做到呢。请帮忙 提前谢谢 有很多方法可以做到这一点。一种方法是: 创建以下变量: EOF_是布尔型的 行计数整数 使用平面文件源将数据引入数据流 使用行计数组件将行数添加到行计数中,以便稍后识别最后一行 使用脚本组件在行之间循环,为每行的计数器添加1 当您的计数器等于Row_Count(即,您正在查看最后一行)中的值时
提前谢谢 有很多方法可以做到这一点。一种方法是:
创建变量
检查
Name DataType Value
check int 0
假设您有一个如下所示的包设计
脚本任务是检查在最后一行有文件结尾的文件
在脚本任务中,在ReadWriteVariable
部分添加变量check
,并在ReadOnlyVariables
中添加每个容器的输出变量ForEach
(假设变量名为LoopFiles
)
在脚本任务中,添加以下代码来读取文件
双击绿色箭头连接脚本任务和数据流任务。将打开一个优先对话框并输入表达式,如下所示
此解决方案避免逐行读取整个文件。为了完整起见,我在这里合并了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;
}
您可以添加一个脚本任务(在ForEach循环容器中)来读取其中的整个文件,并在找到“文件结束”标记时设置一个标志。根据标志,您将转到DFT或引发错误。
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;
}