我有一个源文件夹,其中包含4个csv文件,每个文件中的列数不同 . 我需要从每个csv中仅获取3列(所有4个文件中的3个元素相同的元数据),并从源文件夹中可用的所有文件中加载Raw Destination中的列 . 和原始目标输出文件名必须类似于我们获取时间戳的inputfilename .
在下一级,我需要将此输出原始作为原始源获取并将此记录插入oledb目标 . 并且目标表也必须是动态的 .
例如我有 4 csv files called, test1.csv(10 columns). test2.csv(8), test3.csv(6), test4.csv(10) along with time stamps.
所有这4个文件都有 position_id, asofdate, sumassured 列的共同点,现在我只想将这3列加载到原始目标 . If i load test1.csv then my raw destination outputfile name has to be RW_test1_20120119_222222.RW. similalrly if i load second file its filename as raw destination output. .
谢谢
萨蒂什
2 回答
与往常一样,分解您的问题,直到您将其纳入您可以管理的事物中 .
通过查询处理CSV
下面的两个问题和答案将导致包含OLEDB连接管理器的程序包配置为在
@[User::InputFolder]
文件夹中的CSV上运行 . 已经使用Query上的表达式设置了3个变量CurrentFileName,InputFolder和Query . @ [User :: Query]的表达式看起来像"SELECT position_id, asofdate, sumassured FROM " + @[User::CurrentFileName]
参考答案
SSIS FlatFile Acces via Jet
SSIS Task for inconsistent column count import?
此时,您的包装应该类似于下面的中心部分 . Verify 您可以正确枚举文件夹中的所有CSV并且OLEDB查询部分可以正常工作 .
RAW文件
我不是RAW文件使用方面的专家,所以可能有更好的方式与它们进行交互 . 这将使用第四个变量
RawFileName
. 在@[User::InputFolder] + "RawFile.raw"
上设置一个表达式,这将导致文件被写入C:\ssisdata\so\satishkumar\RawFile.raw
我的一般方法是使用一个脚本任务的数据流,该任务不会向RAW文件目的地发送任何行 .
将目的地配置为
访问模式:变量的文件名
变量名称:User :: RawFileName
写入选项:始终创建
处理CSV
这里的概念是将所有数据附加到在初始步骤中创建的RAW文件中 .
您的来源应该已经配置为
OLE DB连接管理器:FlatFile
数据访问模式:来自变量的SQL命令
变量名称:User :: Query
将目的地配置为
访问模式:变量的文件名
变量名称:User :: RawFileName
写选项:追加
从RAW中提取
此时,foreach枚举器已完成,所有数据已加载到暂存文件中 . 现在是时候消耗它并将数据发送到目的地了 .
将
Raw File Source Transformation
拖到数据流上 . 不出所料,您将配置为访问模式:变量的文件名
变量名称:User :: RawFileName
而不是模拟目标,将其连接到正确的数据目标 .
警告
使用带有
GETDATE/GETUTCDATE
的表达式来定义文件名时要小心,因为它们经常被评估 . 在2005年,我们使用了FileName_HHMMSS并且遇到了问题,因为在创建文件和下一个使用该文件的任务之间,处理没有在同一秒内完成 . 相反,我使用动态但固定的起点获得了更好的成功,通常,这是系统变量,StartTime@[System::StartTime]
您可以在控制流程图上使用ForEach循环容器来迭代txt和csv文件 .