【问题标题】:How to import a fixed width flat file into database using SSIS?如何使用 SSIS 将固定宽度的平面文件导入数据库?
【发布时间】:2012-05-04 14:26:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ssis flat-file


    【解决方案1】:

    这是一个使用 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 部分和下面的屏幕截图。

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

    • 将列名重命名为FirstNameLastNameIdDateRowDelimiter

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

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

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

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

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

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

    • 在 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
    )
    

    【讨论】:

    • 这与我当前的问题无关,但我仍然赞成,因为你做得很好。
    【解决方案2】:

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

    列派生列

    FirstName SUBSTRING(Data, startFrom, Length);

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

    其他列也是如此。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-02-17
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2013-11-15
        • 1970-01-01
        • 1970-01-01
        • 2017-12-08
        • 1970-01-01
        相关资源
        最近更新 更多