从多个文件中获取数据并将其加载到ssis中的原始文件目标(原始文件应该是动态的)

时间:2012-01-19 08:32:06

标签: ssis

我有一个源文件夹,其中包含4个csv文件,每个文件中的列数不同。我需要从每个csv中仅获取3列(所有4个文件中的所有3列相同的元数据),并从源文件夹中可用的所有文件中加载Raw Destination中的列。原始目标输出文件名必须与我们提取的输入文件名+时间戳相同。

在下一级,我需要将此输出原始作为原始源获取并将此记录插入oledb目标。目标表也必须是动态的。

例如我有 4个csv文件,名为test1.csv(10列)。 test2.csv(8),test3.csv(6),test4.csv(10)以及时间戳。

所有这四个文件共有列 position_id,asofdate,sumassured ,现在我只想将这3列加载到原始目标。 如果我加载test1.csv,那么我的原始目标输出文件名必须是RW_test1_20120119_222222.RW。 similalrly如果我加载第二个文件的文件名作为原始目标输出。

由于

萨蒂什南比亚

2 个答案:

答案 0 :(得分:1)

与往常一样,分解您的问题,直到您将问题分解为可以管理的内容。

通过查询处理CSV

以下两个问题和答案将导致包含OLEDB连接管理器的程序包配置为对文件夹@[User::InputFolder]中的CSV进行操作。已经使用Query上的表达式设置了3个变量CurrentFileName,InputFolder和Query。 @ [User :: Query]的表达式看起来像"SELECT position_id, asofdate, sumassured FROM " + @[User::CurrentFileName]

参考答案

此时,您的包裹应该类似于下面的中心部分。 验证您可以正确枚举文件夹中的所有CSV并且OLEDB查询部分可以正常工作。

Conceptual data flow

RAW文件

我不是RAW文件使用方面的专家,因此可能有更好的方式与它们进行交互。这将使用第四个变量RawFileName。在@[User::InputFolder] + "RawFile.raw"上设置一个表达式,这会导致文件被写入C:\ssisdata\so\satishkumar\RawFile.raw

我的一般方法是使用一个脚本任务的数据流,该任务不会向RAW文件目标发送任何行。

Initialize raw file

将目的地配置为

  • 访问模式:来自变量的文件名
  • 变量名称:User :: RawFileName
  • 写入选项:始终创建

处理CSV

这里的概念是将所有数据附加到在初始步骤中创建的RAW文件中。

Process CSVs

您的来源应已配置为

  • OLE DB连接管理器:FlatFile
  • 数据访问模式:来自变量
  • 的SQL命令
  • 变量名称:User :: Query

将目的地配置为

  • 访问模式:来自变量的文件名
  • 变量名称:User :: RawFileName
  • 写入选项:附加

从RAW中提取

此时,foreach枚举器已完成,所有数据已加载到暂存文件中。现在是时候消耗它并将数据发送到目的地了。

Raw file source

Raw File Source Transformation拖到数据流上。不出所料,您将配置为

  • 访问模式:来自变量的文件名
  • 变量名称:User :: RawFileName

而不是模拟目的地,将其连接到正确的数据目的地。

买者

使用带GETDATE/GETUTCDATE的表达式来定义文件名时要小心,因为它们会不断被评估。在2005年,我们使用了FileName_HHMMSS并且遇到了问题,因为在创建文件和下一个使用该文件的任务之间,处理没有在同一秒内完成。相反,我使用动态但固定的起点获得了更好的成功,通常,这是系统变量,StartTime @[System::StartTime]

答案 1 :(得分:0)

您可以在控制流程图上使用ForEach循环容器来迭代txt和csv文件。