LOAD DATA INFILE:跳过列时不能忽略第1行?

时间:2013-10-09 18:14:49

标签: c# mysql sql

我有一个应用程序,它基本上从csv文件中读取数据并将其插入MySQL数据库。

最初一切都很顺利(我的sql知识很乱,但我正在尝试):

LOAD DATA INFILE 'filename.csv' INTO TABLE tablename 
FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES

但是最近我必须验证文件中哪些列将被插入到de数据库中,所以我尝试了这样的事情:

LOAD DATA INFILE 'filename.csv' INTO TABLE tablename FIELDS TERMINATED
BY ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (@col1,@col2,@col3,@ignore,@ignore)
SET col1= @col1, col2= @col2, col3= @col3

如果我取消“IGNORE 1 LINES”部分,该命令工作正常,但我不明白为什么这会弄乱其他一切。我认为这是一些语法错误,但我尝试了所有我能想到的东西,但仍然无效。有没有人有线索?

编辑: 如果我保留“IGNORE 1 LINES”,我会收到“你的SQL语法错误;请查看手册yadda yadda yadda,在第1行的'IGNORE 1 LINES'附近使用。”

为了测试,我使用的是一个简单的文件,这里是前5行:

col1;col2;col3;col4;col5
test;test;test;test;test
test2;test2;test2;test2;test2
test3;test3;test3;test3;test3
test4;test4;test4;test4;test4

1 个答案:

答案 0 :(得分:1)

从语法上讲,你的陈述是正确的,应该按预期工作。

mysql> create table tablename 
    -> (
    ->   col1 varchar(32), 
    ->   col2 varchar(32), 
    ->   col3 varchar(32), 
    ->   col4 varchar(32), 
    ->   col5 varchar(32)
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> LOAD DATA INFILE '/tmp/filename.csv' 
    -> INTO TABLE tablename 
    ->   FIELDS TERMINATED BY ';' 
    ->   LINES TERMINATED BY '\n' -- I'm on a Mac so I'm using \n instead of \r\n
    ->   IGNORE 1 LINES 
    -> (@col1, @col2, @col3, @ignore, @ignore) 
    -> SET col1 = @col1, col2 = @col2, col3 = @col3
    -> ;
Query OK, 4 rows affected (0.01 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 0

mysql> select * from tablename;
+-------+-------+-------+------+------+
| col1  | col2  | col3  | col4 | col5 |
+-------+-------+-------+------+------+
| test  | test  | test  | NULL | NULL |
| test2 | test2 | test2 | NULL | NULL |
| test3 | test3 | test3 | NULL | NULL |
| test4 | test4 | test4 | NULL | NULL |
+-------+-------+-------+------+------+
4 rows in set (0.00 sec)

现在,由于您遇到了语法错误,我猜测问题很可能不在LOAD DATA语句本身,而在于您用来构建和执行查询字符串的C#代码。