17

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

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

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

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

4

3 回答 3

56

这是一个使用SSIS 2008 R2创建的示例包,它解释了如何将平面文件导入数据库表。

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

平面文件数据

  • 在 SQL 服务器数据库中,使用SQL 脚本部分dbo.FlatFile下提供的创建脚本创建一个名为的表。

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

连接管理器

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

数据流任务

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

  • Flat File Source Editor的 General 部分,在Connection manager name中输入一个值(比如Source),然后浏览到平面文件位置并选择文件。此示例使用路径中的示例文件C:\temp\Fixed_Width_File.txt如果文件中有标题行,您可以在跳过标题行文本框中输入值 1 以跳过标题行。

平面文件连接管理器编辑器常规

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

平面文件连接管理器编辑器列

  • 单击高级部分。您会注意到根据我们在上一步中在“列”部分设置的列限制自动为您创建了 5 列。第五列是行分隔符。

平面文件连接管理器编辑器高级

  • 将列名重命名为FirstNameLastNameIdDateRowDelimiter

平面文件连接管理器编辑器高级重命名

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

平面文件连接管理器编辑器高级 ID 列

平面文件连接管理器编辑器高级日期列

  • 单击预览部分。数据将根据列配置显示。

平面文件连接管理器编辑器预览

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

平面文件编辑器连接

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

平面文件编辑器列

  • 在数据流任务上,放置一个OLE DB Destination. 将平面文件源的输出连接到 OLE DB 目标。

数据流任务

  • 在 OLE DB 目标编辑器上,选择名为的OLE DB 连接管理器并将表或视图SQLServer的名称下拉设置为[dbo].[FlatFile]

OLE DB 目标连接

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

OLE DB 目标列

  • 现在包裹已经准备好了。执行打包,将等宽平面文件数据加载到数据库中。

包执行

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

数据导入表

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

希望有帮助。

SQL Scripts

CREATE TABLE [dbo].[FlatFile](
    [Id] [int] NOT NULL,
    [FirstName] [varchar](25) NOT NULL,
    [LastName] [varchar](25) NOT NULL,
    [Date] [datetime] NOT NULL
)
于 2012-04-24T07:10:35.060 回答
1

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

列派生列

FirstName SUBSTRING(数据, startFrom, 长度);

这里 FirstName 的宽度为 25,所以如果我们从第 0 个位置开始考虑,那么在派生列中,您应该通过给出 SUBSTRING(Data, 0, 25); 来指定它。

其他列也是如此。

于 2012-04-26T10:00:25.723 回答
1

很好的解释,湿婆!您的教程和出色的插图指出了微软应该明确的内容

  1. 固定长度行的宽度必须包括回车和换行 (CR & LF) 字符(我发现这是因为预览显示行没有正确排列)
  2. 定义一个额外的列以包含那些 CR 和 LF 字符的所有重要步骤,即使它们不会被导入。我也想通了。在我开始之前找到你的答案会让我受益匪浅。

如果没有这两件事,尝试运行导入将给出以下错误消息: 列“列 x”的数据转换返回状态值 4 和状态文本“文本被截断或一个或多个字符在目标代码页中不匹配."。

我已在此错误文本中添加,希望有人在搜索错误原因时会找到此页面。即使事后,您的教程也值得寻找!

于 2012-07-03T17:03:02.190 回答