LOAD DATA LOCAL INFILE行按问题开头

时间:2018-08-22 12:40:16

标签: mysql csv

我有超过一百万行的csv文件,我只需要将以“ 01”开头的行写入数据库。

.csv文件如下

>>> test(32, 20)
True
>>> test(0, 65535)
True
>>> (65535 + 20) % 65536
19
>>> test(18, 65535)
True

SQL看起来与此关联

01;104;5586;20;1000;
01;105;5586;80;1000;
01;106;5586;80;1000;
04;104;5586;20;1000;
06;105;5586;80;1000;
05;106;5586;80;1000;

因此这可以导入所有行。但是我怎么才能只获得以01; ....

开头的行

2 个答案:

答案 0 :(得分:0)

您可以尝试这个-

LOAD DATA LOCAL INFILE 'filename.csv' 
REPLACE INTO TABLE mytable
FIELDS TERMINATED BY ';' ENCLOSED BY '' 
LINES STARTING BY '01' TERMINATED BY '\r\n'
(`a`, `b`, `c`, `d`, `e`)
  SET `a` = '01';

您会得到类似的东西-

01  104 5586    20  1000
01  105 5586    80  1000
01  106 5586    80  1000

检查您使用的行分隔符-TERMINATED BY子句中的'\ r \ n'或'\ n'。

答案 1 :(得分:0)

如果行中的数据不再包含“ 01”,Devart的解决方案将起作用。

我发现LINES STARTING BY无法按照本文的预期运行: https://bugs.mysql.com/bug.php?id=3632

  

“另一个问题是LINES STARTING BY XXX意味着MySQL会假设行开始于XXX的下一次出现。”

因此,如果我的数据还包括01,而不仅仅是行的开头,则MySQL从这些行读取一些数据。因此,这将插入错误的数据:

01;104;5586;01;1000
01;105;8586;80;1000
01;106;5586;80:0123

我想知道为什么没有像2012年文章中的建议那样的解决方案:

  

(1)让以'X'开头的行继续表示“行在任何地方都包含'X',并且记录中'X'之前的数据将被跳过”,并以此进行记录。

     

(2)添加以'X'位置N开始的行,这意味着“行包含相对于记录开头在字符位置N处开始的'X'。

我最终在每行的开头拆分文件或添加前缀(X)。

.csv这样的

X01;104;5586;20;1000;
X01;105;5586;01;1000;
X01;106;5586;80;1000;
X04;104;5586;01;0123;
X06;105;5586;80;1000;
X05;106;5586;80;1000;

和这样的代码:

LOAD DATA LOCAL INFILE 'filename.csv' 
REPLACE INTO TABLE mytable
FIELDS TERMINATED BY ';' ENCLOSED BY '' 
LINES STARTING BY 'X01' TERMINATED BY '\r\n'
(`a`, `b`, `c`, `d`, `e`) SET `a` = '01';

也许其他人对LINES STARTING BY也有相同的误解。