我有超过一百万行的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; ....
开头的行答案 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也有相同的误解。