嗨,我在SSIS有一个疑问,我想加载多个csv文件到SQL服务器表使用SSIS包。
源路径有3个csv文件,带有固定的标题列和数据,但每个文件在标题之前都有文件解压和日期创建信息,一个文件描述来自2行,标题行从第4行开始,带有数据。另一个文件描述来自1行,9行带有数据的标题,另一个文件来自5行的文件描述,标题行从第7行开始。所有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
在这里,我尝试了如下在包方面:
执行包后,由于描述和日期信息,第2个文件失败:
有可能找到动态有多少行将跳过,计数将在标题行中传递skip.is在SSIS中是可能的。
请告诉我如何在SSIS中完成这项任务
如果你有不断的行数,你应该跳过然后尝试去utube并找到这个视频:从SSIS包的平面文件中删除前N行。
如果你仍然需要找到那个量,你不知道它,尝试写入变量无用行的量,然后值粘贴处理包。
false
,当列值等于列头时,将所有剩余行的输出列值设置为True
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)。