【问题标题】:Why doesn't SSIS recognize tab column delimiters while importing into a database?为什么 SSIS 在导入数据库时​​无法识别制表符列分隔符?
【发布时间】:2011-12-01 18:27:29
【问题描述】:

我正在尝试使用 SSIS 包将数据从 .dat 平面文件传输到 SQL 数据库表。我有一个看起来像这样的 dat 文件:

Booth 1 Weekly  Status
Status  Date    Time    Operator    NESHAP  HEPA    Alarm
Initial Reading 10/3/2011   7:42 AM Ken Forsberg    0.00    0.00    No
System Reading  11/12/2011  3:10 AM System Log  0.24    2.01    No

No Login    11/12/2011  7:00 AM     0.24    2.03    Yes
No Login    11/12/2011  3:00 PM     0.24    2.03    Yes
No Login    11/13/2011  7:00 AM     0.24    2.04    Yes
No Login    11/13/2011  3:00 PM     0.24    2.02    Yes
No Login    11/14/2011  7:00 AM     0.24    2.06    Yes
No Login    11/14/2011  3:00 PM     0.24    2.05    Yes
No Login    11/15/2011  7:00 AM     0.24    2.06    Yes
No Login    11/15/2011  3:00 PM     0.24    2.04    Yes
No Login    11/16/2011  7:00 AM     0.24    2.05    Yes
No Login    11/16/2011  3:00 PM     0.24    2.05    Yes
No Login    11/17/2011  7:00 AM     0.24    2.07    Yes
No Login    11/17/2011  3:00 PM     0.25    2.10    Yes
No Login    11/18/2011  7:00 AM     0.25    2.09    Yes

但是当我运行平面文件连接管理器编辑器时

我有这个通用的:

Locale English(United States)
Code page 1252 (ANSI - Latin I)    
Format: Delimited    
Text qualifier: none    
Header row delimiter: {CR}{LF}    
Header rows to skip: 0    
Column names in the first data row: checked

对于我拥有的列:

Row delimiter: {CR}{LF}    
Column delimiter: Tab {t}

但在预览窗口中它只显示一列

StatusDateTimeOperatorNESHAPHEPAAlarm    
InitialReading10/3/20117:42 AMKen Forsberg0.000.00No                
System Reading11/12/20113:10 AMSystem Log0.242.01No    
NoLogin11/12/20117:00 AM0.242.03Yes    
NoLogin11/12/20113:00 PM0.242.03Yes    
...

我的行分隔符为Carriage ReturnLine Feed,列分隔符为Tab,但您可以看到标签未被识别。

我确实在 Notepad++ 中打开了 .dat 文件,以确认它们是由 Tab 分隔的。

我做错了什么?

【问题讨论】:

    标签: ssis


    【解决方案1】:

    以下是问题:

    1. 文件的第一行有一个不相关的行。当我说不相关时,我的意思是它与文件的其余部分不匹配。

    2. 标题行实际上在文件的第二行,而不是在第一行。

    我将问题中的数据放入 .dat 文件中。当您在 Notepad++ 中打开时,请确保您的文件看起来完全如下所示。箭头表示tabs。要在 Notepad++ 中查看特殊字符,请单击 View --> Show Symbol --> Show All Characters

    当您配置平面文件连接管理器时,在字段Header rows to skip 中输入值2。另外,不要选中复选框Column names in the first data row,因为列名不在第一行,而是在第二行。

    当您切换到Columns 部分时,如果您的文件与第一个屏幕截图中显示的内容实际匹配,列应正确显示数据。此外,SSIS 将自动检测行和列分隔符。但是,这些行将被命名为 Column 0、Column 1 等,因为我们跳过了 2 行。

    您可以单击Advanced 选项卡并根据您的喜好重命名列名。

    此外,Preview 部分中的数据应正确显示。

    希望对您有所帮助。

    【讨论】:

    • 它不适合我。在第 6 栏中,它没有识别 {CR}{LF}。所以在第 6 列我有 NoNo 登录然后在 Col7 我有日期然后在 col8 我有时间然后在 col9 我有值 0.242.00Yes。它无法识别这些标签。不知道怎么回事请帮忙。
    • 我还必须将文本限定符设置为 {"}。现在一切正常。感谢您的帮助。
    【解决方案2】:

    您拥有哪个版本的 SQL Server?

    我的客户有 SQl Server 2008R2 SP2。我没有把它缩小到一个版本。

    我发现,即使平面文件连接管理器显示设置了“行分隔符”,XML 代码在代码中也没有十六进制。

    我的例子是使用行分隔符 LF

    注意ASCII 的值是 4 个字符,在本例中为 000A。其他字符也是必需的。前缀是_x,后缀是_

    要修改 XML 代码,请打开 SSIS 项目并右键单击包并选择“查看代码”。它应该在第 41 行。对于其他行分隔符,请查找 ASCII 表。

    您可以对此字符串进行搜索和替换。使用全部替换并查看“当前项目”

    查找内容:“RowDelimiter” xml:space="preserve">x000A

    【讨论】:

      【解决方案3】:

      我认为您至少需要跳过一个标题行,因为Booth 1 Weekly Status 在第一行,没有标题字段,并且您已指示 SSIS 从第一行获取标题字段。

      【讨论】:

        【解决方案4】:

        只是为了测试,在excel中打开.dat文件,看看是否得到想要的结果。

        正如@competent_tech 提到的,您可能需要处理第一行:-)

        【讨论】:

          猜你喜欢
          • 2021-02-23
          • 2011-09-10
          • 1970-01-01
          • 1970-01-01
          • 2021-08-28
          • 1970-01-01
          • 1970-01-01
          • 2021-08-26
          • 2015-06-21
          相关资源
          最近更新 更多