MySQL错误代码:1262。行x被截断;它包含的数据多于输入列

时间:2018-08-12 09:15:31

标签: mysql sql database database-design datatable

我需要将文件内容加载到表中。该文件包含用逗号分隔的文本。这是一个非常大的文件。我无法更改已经像这样给我的文件。

12.com,128.15.8.6,TEXT1,no1,['128.15.8.6']
23com,122.14.10.7,TEXT2,no2,['122.14.10.7']
45.com,91.33.10.4,TEXT3,no3,['91.33.10.4']
67.com,88.22.88.8,TEXT4,no4,['88.22.88.8', '5.112.1.10']

我需要将文件加载到四列的表中。因此,例如,上面的最后一行应在表中,如下所示:

table.col1: 67.com

table.col2 :88.22.88.8

table.col3: TEXT3

table.col4: 3号

table.col5 :['88.22.88.8','5.112.1.10']

使用MySQL工作台,我创建了一个表,其中有五列均为varchar类型。然后,我运行以下SQL命令:

LOAD DATA INFILE '/var/lib/mysql-files/myfile.txt'
  INTO TABLE `mytable`.`myscheme`
  fields terminated BY ','

最后一个列字符串(包含我不想分隔的逗号)会导致问题。

Error:
Error Code: 1262. Row 4 was truncated; it contained more data than there were input columns

请问如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

仅使用加载数据infile并不困难-注意变量的使用。

 drop table if exists t;
create table t(col1 varchar(20),col2 varchar(20), col3 varchar(20), col4 varchar(20),col5 varchar(100));

truncate table t;

load data infile 'test.csv' into table t LINES TERMINATED BY '\r\n' (@var1)

    set col1 = substring_index(@var1,',',1),
    col2 = substring_index(substring_index(@var1,',',2),',',-1),
    col3 = substring_index(substring_index(@var1,',',3),',',-1),
    col4 = substring_index(substring_index(@var1,',',4),',',-1),
    col5 = concat('[',(substring_index(@var1,'[',-1)))

;

select * from t;
    +--------+-------------+-------+------+------------------------------+
| col1   | col2        | col3  | col4 | col5                         |
+--------+-------------+-------+------+------------------------------+
| 12.com | 128.15.8.6  | TEXT1 | no1  | ['128.15.8.6']               |
| 23com  | 122.14.10.7 | TEXT2 | no2  | ['122.14.10.7']              |
| 45.com | 91.33.10.4  | TEXT3 | no3  | ['91.33.10.4']               |
| 67.com | 88.22.88.8  | TEXT4 | no4  | ['88.22.88.8', '5.112.1.10'] |
+--------+-------------+-------+------+------------------------------+
4 rows in set (0.00 sec)

答案 1 :(得分:0)

在这种情况下,为避免与逗号不正确相关的问题,您可以将行..导入单列表..(根据需要在Medimun TEXT上输入TEXT类型)。

另外使用locate(一个用于第一个逗号,一个用于第二个,一个用于第三个..)和substring,您可以从每一行中提取所需的四列

最后加上insert select,您可以填充目标表..根据需要分隔列..

答案 2 :(得分:0)

这个评论太长了。

您的CSV文件中有一个可怕的数据格式。我认为您应该重新生成文件。

MySQL具有帮助您处理此数据的功能,尤其是OPTIONALLY ENCLOSED BY中的LOAD DATA INFILE选项。唯一的警告是,这允许一个转义字符,而不是两个。

我的第一个建议是用另一个字符替换字段分隔符-我想到制表符或|。任何不用于字段内值的字符。

第二个方法是对OPTIONALLY ENCLOSED BY使用双引号。然后在数据文件中将'['替换为'"[',将]替换为']"'。即使您无法重新生成文件,也可以使用grep或Pearl或python之类的文件对其进行预处理,以进行简单的替换。

然后,您可以使用MySQL的导入功能来加载文件。