如何使用SSIS将固定宽度的平面文件导入数据库?

时间:2012-04-23 23:22:11

标签: ssis flat-file

是否有人有关于如何使用SSIS包将固定宽度平面文件导入数据库的教程?

我有一个包含不同长度列的平面文件。

Column name    Width
-----------    -----
First name        25
Last name         25
Id                 9
Date               8

如何将平面文件转换为列?

3 个答案:

答案 0 :(得分:54)

以下是使用 SSIS 2008 R2 创建的示例包,其中介绍了如何将平面文件导入数据库表。

  • 创建一个名为Fixed_Width_File.txt的固定宽度平面文件,其数据如屏幕截图所示。屏幕截图使用Notepad ++显示文件内容。它能够显示回车和换行等特殊字符。 CR LF 表示行分隔符回车换行

Flat file data

  • 在SQL Server数据库中,使用 SQL Scripts 部分下提供的创建脚本创建名为dbo.FlatFile的表。

  • 创建一个新的SSIS包并添加一个新的OLE DB连接管理器,该管理器将连接到SQL Server数据库。假设OLE DB连接管理器命名为 SQLServer

Connection manager

  • 在包的控制流选项卡上,放置数据流任务

Data flow task

  • 双击数据流任务,您将进入数据流选项卡。在数据流选项卡上,放置平面文件源。双击平面文件源,将出现平面文件源编辑器。单击新建按钮以打开平面文件连接管理器编辑器

  • 平面文件源编辑器的“常规”部分,在连接管理器名称中输入一个值(例如)并输入浏览到平面文件位置并选择文件。此示例使用路径C:\temp\Fixed_Width_File.txt中的示例文件如果文件中有标题行,则可以在标题行中输入值1以跳过文本框以跳过标题行。

Flat file connection manager editor General

  • 点击部分。根据您的选择更改字体我选择了Courier New,所以我可以看到更少的滚动数据。在“行宽”文本框中输入值69。此值是行分隔符的所有列的宽度+ 2的总和。设置正确的行宽后,应在“源数据列”部分正确查看固定宽度文件数据。现在,您必须单击适当的位置以确定列限制。请注意第4,5,6节以及下面的屏幕截图。

Flat file connection manager editor Columns

  • 点击高级部分。根据我们在上一步中的 Columns 部分设置的列限制,您会注意到为您自动创建了5个列。第五列用于行分隔符。

Flat file connection manager editor Advanced

  • 将列名重命名为FirstNameLastNameIdDateRowDelimiter

Flat file connection manager editor Advanced Renamed

  • 默认情况下,列将使用DataType字符串[DT_STR]进行设置。如果我们非常肯定,某个列将具有不同的数据类型,我们可以在“高级”部分中对其进行配置。我们会将Id列更改为数据类型four-byte signed integer [DT_I4],将Date列更改为数据类型date [DT_DATE]

Flat file connection manager editor Advanced Id column

Flat file connection manager editor Advanced Date column

  • 点击预览部分。数据将按列配置显示。

Flat file connection manager editor Preview

  • 单击平面文件连接管理器编辑器上的确定,平面文件连接将分配给数据流任务中的平面文件源。

Flat file editor connection

  • 在“平面文件源编辑器”上,单击“列”部分。您将注意到在平面文件连接管理器中配置的列。取消选中RowDelimiter,因为我们不需要它。

Flat file editor columns

  • 在数据流任务中,放置OLE DB Destination。将Flat文件源的输出连接到OLE DB Destination。

Data flow task

  • 在OLE DB目标编辑器上,选择名为SQLServer OLE DB连接管理器,并将表的名称或视图下拉为{ {1}}

OLE DB Destination connection

  • 在OLE DB目标编辑器上,单击“映射”部分。由于平面文件连接管理器中的列名与数据库中的列相同,因此映射将自动进行。如果名称不同,则必须手动映射列。单击“确定”。

OLE DB Destination columns

  • 现在包准备好了。执行包以将固定宽度的平面文件数据加载到数据库中。

Package execution

  • 如果您在数据库中查询表dbo.FlatFile,您会注意到导入数据库的平面文件数据。

Data imported into table

此示例应该让您了解如何将固定宽度的平面文件导入数据库。它没有解释如何处理错误日志记录,但这应该可以帮助您在使用软件包时帮助您发现其他与SSIS相关的功能。

希望有所帮助。

<强> [dbo].[FlatFile]

SQL Scripts

答案 1 :(得分:1)

在派生列转换中,您可以为每个列使用SUBSTRING()函数。 示例:

列DerivedColumn

FirstName SUBSTRING(Data,startFrom,Length);

这里FirstName的宽度为25,所以如果我们从第0个位置然后在派生列中考虑,你应该通过给出SUBSTRING(数据,0,25)来指定它;

与其他列类似。

答案 2 :(得分:1)

很好解释,西瓦!您的教程和优秀插图指出了Microsoft应该明确的内容

  1. 固定长度行的宽度必须包括回车符和换行符(CR&amp; LF)字符(我想出因为预览显示行没有正确排列)
  2. 定义一个额外列以包含那些CR&amp;的所有重要步骤LF字符,即使它们不会被导入。我也想到了这一点。在我开始之前找到你的答案我会受益。
  3. 如果没有这两件事,尝试运行导入将显示以下错误消息: 列“列x”的数据转换返回状态值4和状态文本“文本被截断或目标代码页中的一个或多个字符不匹配。”。

    我已在此错误文本中添加了希望有人在搜索错误原因时找到此页面。即使在事实发生之后,你的音乐也值得一试!