如何在 ssis 中处理之前检查 csv 文件中的文件结尾
Posted
技术标签:
【中文标题】如何在 ssis 中处理之前检查 csv 文件中的文件结尾【英文标题】:how to check end of file in a csv file before processing it in ssis 【发布时间】:2013-03-18 17:33:27 【问题描述】:我创建了一个 SSIS 包,它使用 ForEachLoop 容器处理 .CSV 文件。
所有 csv 文件的最后一行都包含“END OF FILE”。
只有那些在最后一行包含“END OF FILE”的 CSV 文件才会被处理。
怎么做。请帮忙。
提前致谢。
【问题讨论】:
您可以添加一个脚本任务(在 ForEach 循环容器内)来读取整个文件并在找到“END OF FILE”标记时设置一个标志。然后根据标志,您将转到 DFT 或引发错误。 【参考方案1】:创建变量check
Name DataType Value
check int 0
假设你有一个像下面这样的包装设计
脚本任务是检查last row
处有End of File
的文件
在脚本任务中,在ReadWriteVariable
部分添加变量check
,在ReadOnlyVariables
中添加来自ForEach container
的输出变量(假设变量名为LoopFiles
)
在脚本任务中添加以下代码来读取文件。有几种方法可以读取文件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;
双击绿色箭头连接脚本任务和数据流任务。将打开一个优先对话框并输入如下表达式
【讨论】:
【参考方案2】:有很多方法可以做到这一点。一种方法是:
-
创建以下变量:
EOF_Found 布尔值
Row_Count 整数
-
使用平面文件源将数据引入数据流
使用行计数组件将行数添加到 Row_Count,以便稍后识别最后一行
使用脚本组件循环遍历行,为每行的计数器加 1
当您的计数器等于 Row_Count 中的值(即您正在查看最后一行)时,检查您希望“END OF FILE”出现的列中的值(取决于您如何设置平面文件连接管理器) .如果它等于“END OF FILE”,则将 EOF_Found 的值更改为 True
在脚本组件之后,添加引用 EOF_Found 中的值的派生列
使用条件拆分,检查派生列的值,仅在 True 时处理
【讨论】:
【参考方案3】:此解决方案可避免逐行读取整个文件。为了完整起见,我在这里合并了 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;
【讨论】:
以上是关于如何在 ssis 中处理之前检查 csv 文件中的文件结尾的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SSIS 将 File1 标头中的单个值与 File2 中的总行数进行比较(csv)