【问题标题】:Importing a CSV file that has pipe characters. Error says truncation导入包含竖线字符的 CSV 文件。错误说截断
【发布时间】:2017-03-04 03:06:53
【问题描述】:

我不是棚子里最锋利的工具,所以请多多包涵。我正在尝试将 csv 文件导入 Microsoft SQL Server 2016。但是,每当我尝试这样做时,都会遇到错误。我认为这可能与管道字符有关。我从中获取文件的网站有这样的说法:

文本字段由竖线字符 (ascii 124) 包围。日期和数字字段不是。逗号分隔所有字段。

这是我的查询的样子:

CREATE TABLE cands16 (
    [Cycle] [char](4) NOT NULL,
    [FECCandID] [char] (9) NOT NULL,
    [CID] [char] (9) NULL,
    [FirstLastP] [varchar] (50) NULL,
    [Party] [char] (1) NULL,
    [DistIDRunFor] [char] (4) NULL,
    [DistIDCurr] [char] (4) NULL,
    [CurrCand] [char] (1) NULL,
    [CRPICO] [char] (1) NULL,
    [RecipCode] [char] (2) NULL,
    [NoPacs] [char] (1) NULL
) ON [PRIMARY]


BULK
INSERT cands16
FROM 'C:\aaa open secrets\CampaignFin16\Cands16.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO

这是我的错误:

Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 1, column 1 (Cycle).
Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 2, column 1 (Cycle).
Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 3, column 1 (Cycle).
Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 4, column 1 (Cycle).
Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 5, column 1 (Cycle).
Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 6, column 1 (Cycle).
Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 7, column 1 (Cycle).
Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 8, column 1 (Cycle).
Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 9, column 1 (Cycle).
Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 10, column 1 (Cycle).
Msg 4863, Level 16, State 1, Line 19
Bulk load data conversion error (truncation) for row 11, column 1 (Cycle).
Msg 4865, Level 16, State 1, Line 19
Cannot bulk load because the maximum number of errors (10) was exceeded.
Msg 7399, Level 16, State 1, Line 19
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 19
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

这是我的 CSV 文件的婴儿版:

|2016|,|H4GA02060|,|N00035294|,|Greg Duke (R)|,|R|,|GA02|,|    |,|Y|,|Y|,|C|,|RC|,| |
|2016|,|H4GA02078|,|N00036257|,|Vivian Childs (R)|,|R|,|GA02|,|    |,| |,| |,| |,|RN|,| |
|2016|,|H4GA04116|,|N00035798|,|Thomas Brown (D)|,|D|,|GA04|,|    |,| |,| |,| |,|DN|,| |
|2016|,|H4GA04124|,|N00035862|,|Thomas Wight (D)|,|D|,|GA07|,|    |,| |,| |,| |,|DN|,| |
|2016|,|H4GA06087|,|N00026160|,|Tom Price (R)|,|R|,|GA06|,|GA06|,|Y|,|Y|,|I|,|RW|,| |
|2016|,|H4GA08067|,|N00026163|,|Lynn A Westmoreland (R)|,|R|,|GA03|,|GA03|,| |,|Y|,|I|,|RI|,| |
|2016|,|H4GA09065|,|N00036258|,|Bernard Fontaine (R)|,|R|,|GA09|,|    |,| |,|Y|,|C|,|RL|,| |
|2016|,|H4GA10071|,|N00035370|,|Mike Collins (R)|,|R|,|GA10|,|    |,| |,| |,| |,|RN|,| |
|2016|,|H4GA11046|,|N00035321|,|Susan Davis (R)|,|R|,|GA11|,|    |,| |,| |,| |,|RN|,| |

【问题讨论】:

  • 我也遇到过这个问题。您是否在导入过程中创建表?如果是这样,请先尝试创建表,而不是使用 create table syatement 或使用向导。确保每列的长度足以容纳内容。
  • @FredrikRudberg 我创建了表格,以便将导入的数据放入其中。我从给我内容的网站上得到了制作这张表格的说明。该网站还指定了每列需要多长时间来保存内容。你能告诉我如何使用 edit create table 语句创建表吗?我
  • 报错信息告诉我列大小不够
  • @FredrikRudberg 如果这是错误的意思,那么网站可能是错误的。我会增加列容量
  • @FredrikRudberg 先生,您既是冠军又是学者。你的解决方案奏效了。看来这些愚蠢的管道算作字符。网站推荐的柱长没有考虑管道。我将不得不提出另一个问题来询问如何处理它们。请发表您的评论作为答案,以便我对其进行投票,并为您回答问题给予应有的评价。

标签: python sql-server csv truncation


【解决方案1】:

问题涉及列的大小。导入功能警告说,在导入期间必须进行截断,从而导致数据丢失。

增加表格列的大小或删除竖线字符。

【讨论】:

    【解决方案2】:

    在下一版本的 SQL Server 中,您也可以使用FIELDQUOTE 字符。这是描述自 SQL Server 2008 以来版本的页面上的善意documented,可能会使普通读者感到困惑:

    BULK INSERT cands16
        FROM 'C:\aaa open secrets\CampaignFin16\Cands16.txt'
    WITH (FIELDTERMINATOR = ',',
          ROWTERMINATOR = '\n',
          FIELDQUOTE = '|'
         );
    

    同时,我最好的建议是将数据加载到临时表中,然后通过删除第一个和最后一个字符将列解析为单独的列。

    您可以通过使用'|,|' 作为字段分隔符并仅更改第一列和最后一列中的值来简化这一点。

    【讨论】:

    • 我试过你的方法。它说:“FIELDQUOTE”附近的语法不正确。需要注意的是,FIELDQUOTE 这个词并没有像我预期的那样变成蓝色
    • 我还必须在右括号后面加上分号吗?
    • @anang 。 . .分号是可选的,但建议使用。它标识一个语句已经结束。
    • 我在想,如果我输入分号,那么括号后面的 GO 就不会注册。另外,SQL Server 2016 中是否使用了 FIELDQUOTE?
    • @anang 。 . .我想这是2016年以后的版本。
    猜你喜欢
    • 2016-05-22
    • 2017-03-24
    • 2018-10-07
    • 2017-03-17
    • 1970-01-01
    • 2018-08-13
    • 2012-12-19
    • 2019-01-03
    • 2015-02-08
    相关资源
    最近更新 更多