gpt4 book ai didi

c# - SSIS-如何从文本文件加载数据,而文件路径在另一个文本文件中?

转载 作者:行者123 更新时间:2023-12-02 18:09:30 25 4
gpt4 key购买 nike

我有一个文本文件,其中包含要加载到数据库中的文件列表。

该列表包含两列:

FilePath,Type
c:\f1.txt,A
c:\f2.txt,B
c:\f3.txt,B


我想提供此文件作为SSIS的源。然后,我希望它逐行通过。对于每一行,我希望它读取FilePath列中的文件并检查Type。

如果type是A,那么我希望它忽略位于当前行FilePath列的文件的前4行,然后将其余数据加载到表中。
如果type是B,那么我希望它打开文件,然后将所有行的文件的第一列复制到表1中,将第二列复制到表2中。

如果有人可以向我提供我需要遵循的高级步骤列表,我将不胜感激。

任何帮助表示赞赏。

最佳答案

这是在SSIS中执行此操作的一种方法。以下步骤是关于SSIS 2008 R2的。

创建一个SSIS包并创建三个包变量,分别为FileNameFilesToReadType。 FilesToRead变量将保存文件列表及其类型信息。我们将有一个循环,该循环将遍历所有这些记录,并在每次循环时将其信息存储在FileName和Type变量中。



在控制流选项卡上,放置一个数据流任务,然后放置一个ForEach Loop容器。数据流任务将读取包含必须处理的文件列表的文件。然后,循环将遍历每个文件。您的控制流选项卡最终将看起来像这样。目前,由于未进行任何配置,因此会出现错误。我们将尽快解决。



在“连接管理器”部分,您需要四个连接。
首先,您需要一个OLE DB连接才能连接到数据库。将此命名为SQLServer
其次,使用平面文件连接管理器读取包含文件和类型列表的文件。该平面文件连接管理器将包含配置为FileNameType的两列,将其命名为Files
第三,另一个平面文件连接管理器读取所有类型A的文件。将其命名为Type_A。在此平面文件连接管理器中,在文本框Header rows to skip中输入值4,以便始终跳过前四行。
第四,另一个平面文件连接管理器可以读取所有B型文件。将其命名为Type_B



让我们回到控制流程。双击第一个数据流任务。在数据流任务内部,放置一个平面文件源,该文件源将使用连接管理器Files读取所有文件,然后放置一个Recordset Destination。在记录集目标中配置变量FilesToRead。您的第一个数据流任务将如下所示。



现在,让我们再次回到“控制流”选项卡。如下所示配置ForEach循环。此循环将遍历存储在变量FilesToRead中的记录集。因为记录集包含两列,所以每当一条记录循环通过时,变量FileNameType将被分配当前记录的值。




在内部,对于每个循环容器,有两个数据流任务,即Type A filesType B files。您可以根据需要配置每个数据流任务,以从连接管理器中读取文件。但是,我们需要根据正在读取的文件来禁用任务。
Type A files数据流任务仅应在处理A型文件时启用。
同样,仅在处理B类型文件时,才应启用Type B files数据流任务。
为此,请单击Type A files数据流任务,然后按F4键以显示属性。单击Expression属性上可用的省略号按钮。
在属性表达式编辑器上,选择“ Disable属性”,然后输入表达式!(@[User::Type] == "A")



同样,单击Type B files数据流任务,然后按F4键以显示属性。单击Expression属性上可用的省略号按钮。
在属性表达式编辑器上,选择“ Disable属性”,然后输入表达式!(@[User::Type] == "B")



这是一个示例Files.txt,列表中仅包含A类型文件。执行该软件包以读取此文件时,您会注意到只有Type A files数据流任务。




这是另一个示例Files.txt,列表中仅包含B型文件。执行该软件包以读取此文件时,您会注意到只有Type B files数据流任务。




如果Files.txt同时包含A和B类型的文件,则循环将根据正在处理的文件的类型执行适当的数据流任务。

配置数据流任务类型A文件

假设您的A型平面文件具有三列布局,如下所示,并以逗号分隔值。使用Notepad ++和所有特殊字符显示此处的文件数据。 CR LF表示行以回车和换行结束。该文件存储在路径C:\ f1.txt中



我们需要数据库中的表来导入数据。让我们在SQL Server数据库中创建一个名为dbo.Table_A的表,如下所示。



现在,转到SSIS包。以下是配置名为Type_A的平面文件连接管理器的详细信息。给连接管理器起个名字。您需要在“标题行”中指定值4以跳过文本框。您的平面文件连接管理器应如下所示。




如果需要,可以在“高级”选项卡上重命名列名称。



现在已经配置了连接管理器,我们需要配置数据流任务Type A files来处理相应的文件。双击数据流任务Type A files。将平面文件源和OLE DB目标放在任务内。



平面文件源必须配置为从平面文件连接管理器读取文件。




数据流任务没有做任何特殊的事情。它仅读取类型A的平面文件,并将数据插入表dbo.Table_A中。现在,我们需要配置OLE DB目标以将数据插入数据库。平面文件连接管理器和表中配置的列名不同。因此,必须手动映射它们。




现在,已配置数据流任务。我们必须确保正确传递了从Files.txt中读取的文件路径。为此,请单击Type_A平面文件连接管理器,然后按F4键以显示属性。将DelayValidation属性设置为True。单击Ellipsis属性上的Expressions按钮。



在“属性表达式”构建器上,选择ConnectionString属性并将其设置为Expression @[User::FileName]



这是一个仅包含Type A文件的示例Files.txt文件。



以下是样本类型A文件f01.txt和f02.txt




包执行后,将在表Table_A中找到以下数据



对于B型文件,必须遵循上述配置步骤。但是,由于文件处理逻辑不同,因此数据流任务看起来会稍有不同。数据流任务的Type B文件将是这样。由于您必须将B型文件中的两列插入不同的表中。您必须使用多播转换,该转换将创建输入数据的克隆。您可以使用每个多播输出传递到不同的转换或目标。


希望能帮助您完成任务。

关于c# - SSIS-如何从文本文件加载数据,而文件路径在另一个文本文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10324149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com