提问者:小点点

如何跳过ssis中的动态标题行


嗨,我在SSIS有一个疑问,我想加载多个csv文件到SQL服务器表使用SSIS包。

源路径有3个csv文件,带有固定的标题列和数据,但每个文件在标题之前都有文件解压和日期创建信息,一个文件描述来自2行,标题行从第4行开始,带有数据。另一个文件描述来自1行,9行带有数据的标题,另一个文件来自5行的文件描述,标题行从第7行开始。所有csv文件中的列标题都是固定的

文件位置:

  1. C:\test\a. csv
  2. C:\test\b. csv
  3. C:\test\c. csv

a. csv文件数据如下:

here descritpion and dates comes 2and 3 row.actual data start from 4th row onwards
descritiion:empinfromationforhydlocation
creadeddate:2018-04-20

id |name|loc
1  |a   |hyd

b. csv文件数据如下:

here descritpion and dates comes 1and 2 row.actual data start from 9th row onwards
descritiion:empinfromationforhydlocation
creadeddate:2018-04-21

id |name|loc
10  |b   |chen

c.csv file data like below :

here descritpion and comes 5 and 6 row.actual data start from 9th row onwards
descritiion:empinfromationforhydlocation
creadeddate:2018-04-21

id |name|loc
20  |c   |bang

基于上述3个文件,我想将数据加载到目标sql服务器表emp

id  | Name |Sal
1   |a     |hyd
2   |b     |chen
3   |c     |bang

在这里,我尝试了如下在包方面:

  • 创建变量:
    • 文件位置路径:C:\test\
    • 文件名:C:\test\a. csv
    • 为每个文件枚举器选择枚举器的类型
    • 目录:c:\test
    • 变量映射:文件名配置它。
    • 文件类型:*. csv
    • 检索文件名:文件名和扩展名

    执行包后,由于描述和日期信息,第2个文件失败:

    • 描述和日期不是经常出现固定行的第二天文件
    • 描述和日期将带有不同的行

    有可能找到动态有多少行将跳过,计数将在标题行中传递skip.is在SSIS中是可能的。

    请告诉我如何在SSIS中完成这项任务


共3个答案

匿名用户

如果你有不断的行数,你应该跳过然后尝试去utube并找到这个视频:从SSIS包的平面文件中删除前N行。
如果你仍然需要找到那个量,你不知道它,尝试写入变量无用行的量,然后值粘贴处理包。

匿名用户

  1. 在平面文件连接管理器中取消选中从第一行读取标题选项,然后转到高级选项卡并手动定义列元数据(列名,长度…)
  2. 在数据流任务中,添加一个脚本组件
  3. 在脚本组件编辑器中,转到输入和输出选项卡并添加一个布尔类型的输出列
  4. 在脚本编辑器中,不断检查第一列值是否等于列头,当不满足此条件时,始终将输出列值设置为false,当列值等于列头时,将所有剩余行的输出列值设置为True
  5. 在Script组件旁边,添加条件分割以根据生成的列值过滤行(必须忽略False值的行)

匿名用户

为同一文件创建具有单列的新文件连接。

添加带有转换脚本组件的数据流任务。

将一个readwrite变量作为索引附加到脚本组件(示例代码上的skiprows)并检查进程输入行中每一行的第一个字符。

bool checkRow;
int rowCount;
public override void PreExecute()
{
    base.PreExecute();
    checkRow = true;
    rowCount = 0;
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (checkRow)
    {
        rowCount++;
        if (Row.Data.StartsWith("id |"))
            checkRow = false;
    }
}
public override void PostExecute()
{
    base.PostExecute();
    Variables.skiprows = rowCount;//set script variable
}

然后,您只需在表达式“HeaderRowsToSkip”中为原始平面文件连接设置变量。

如果文件非常大,您可以在找到第一行时强制脚本失败(例如零除法)。添加错误事件并将系统变量“传播”设置为false(@[System::传播]=false)。