2

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

最初一切都很好(我的sql知识一团糟,但我正在尝试):

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

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

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
测试;测试;测试;测试;测试
测试2;测试2;测试2;测试2;测试2
测试3;测试3;测试3;测试3;测试3
测试4;测试4;测试4;测试4;测试4
4

1 回答 1

1

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

mysql> 创建表表名
    -> (
    -> col1 varchar(32),
    -> col2 varchar(32),
    -> col3 varchar(32),
    -> col4 varchar(32),
    -> col5 varchar(32)
    ->);
查询正常,0 行受影响(0.03 秒)

mysql> 加载数据输入文件'/tmp/filename.csv'
    -> INTO TABLE 表名
    -> 由“;”终止的字段
    -> LINES TERMINATED BY '\n' -- 我在 Mac 上,所以我使用 \n 而不是 \r\n
    -> 忽略 1 行
    ->(@col1、@col2、@col3、@ignore、@ignore)
    -> 设置 col1 = @col1,col2 = @col2,col3 = @col3
    ->;
查询正常,4 行受影响(0.01 秒)
记录:4 删除:0 跳过:0 警告:0

mysql> 从表名中选择 *;
+-------+-------+--------+------+------+
| col1 | col2 | col3 | col4 | col5 |
+-------+-------+--------+------+------+
| 测试 | 测试 | 测试 | 空 | 空 |
| 测试2 | 测试2 | 测试2 | 空 | 空 |
| 测试3 | 测试3 | 测试3 | 空 | 空 |
| 测试4 | 测试4 | 测试4 | 空 | 空 |
+-------+-------+--------+------+------+
4 行一组(0.00 秒)

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

于 2013-10-09T19:07:20.207 回答