我需要将文件内容加载到表中。该文件包含用逗号分隔的文本。这是一个非常大的文件。我无法更改已经像这样给我的文件。
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
请问如何解决这个问题。
答案 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的导入功能来加载文件。