为什么SSIS在导入数据库时​​不识别制表符列分隔符?

时间:2011-12-01 18:27:29

标签: ssis

我正在尝试使用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分隔的,并且它们是。

我做错了什么?

4 个答案:

答案 0 :(得分:6)

以下是问题:

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

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

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

    File in Notepad++

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

    General

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

    Columns

    您可以点击Advanced标签,然后根据您的偏好重命名列名称。

    Advanced

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

    Preview

    希望有所帮助。

答案 1 :(得分:1)

您拥有哪个版本的SQL Server?

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

我发现即使Flat File Connection Manager显示设置了'Row Delimeter',XML代码也没有代码中的十六进制。

我的例子是使用Row Delimiter LF

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

正如@competent_tech所提到的,你可能想要处理第一行: - )