我需要一些帮助。
我正在从 oledb 源导入 .csv 文件中的一些数据。我不希望 header 在目标中出现两次。如果我取消选中“第一个数据行中的列名”属性,则标题也不会在第一次执行时填充。
截至目前的输出。
Col1,Col2
A,B
Col1,Col2
C,D
如果文件为空,我怎样才能让程序包以这样的方式运行,标题被插入。然后,如果再次执行,则不包括 header ,仅包括数据。
有一个类似的线程,但无法应用解决方案如何使用表达式来获取目标本身的行数。很久以前了,所以我创建了一个新的。
非常感谢您的帮助。
-阿克谢
最佳答案
也许我遗漏了什么,但这对我有用。我没有遇到 ColumnNamesInFirstDataRow 的只读问题
我创建了一个名为 AddHeader
的包级变量,键入 Boolean 并将其设置为 True
。我添加了一个名为 FFCM 的平面文件连接管理器,并将其配置为使用 2 列 HeadCount (int)、AddHeader (boolean) 的 CSV 输出。在连接管理器的属性中,我为属性“ColumnNamesInFirstDataRow”添加了一个表达式,并为其分配了一个值 @[User::AddHeader]
我添加了一个脚本任务来测试文件的大小。它具有对变量 AddHeader 的读/写访问权限。然后我使用这个脚本来确定文件是否为空。如果您对“空”的定义是它有一个标题行,那么我会调整 if 检查中的逻辑以匹配该长度。
public void Main()
{
string path = Dts.Connections["FFCM"].ConnectionString;
System.IO.FileInfo stats = null;
try
{
stats = new System.IO.FileInfo(path);
// checking length isn't bulletproof based on how the disk is configured
// but should be good enough
// http://stackoverflow.com/questions/3750590/get-size-of-file-on-disk
if (stats != null && stats.Length != 0)
{
this.Dts.Variables["AddHeader"].Value = false;
}
}
catch
{
// no harm, no foul
}
Dts.TaskResult = (int)ScriptResults.Success;
}
我循环了两次以确保生成追加场景
我删除了我的文件并运行了包,但只有一次 header 。
关于ssis - 防止平面文件目标中的重复 header - SSIS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16384364/