[嗨,我正在将csv文件中的数据导入到MySQL表中。当基本查询如
select * from Mapping where floor = 'L1';
没有用,经过很多努力,我发现这是由于空白和查询所致
select * from Mapping where floor like '%L1%';
给了我预期的结果。
这是我将csv加载到表中的方式:
LOAD DATA LOCAL INFILE "../.../mapping.csv" INTO TABLE db.Mapping
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES
我不确定空白来自哪里?我是否以正确的方式加载了csv?我可以做些什么来避免空格吗?
我已经按照答案尝试过,
Query OK, 0 rows affected (0.00 sec)
Rows matched: 49 Changed: 0 Warnings: 0
它说没有任何影响。
select * from Mapping where floor = 'L1';
仍然无法使用,但是
select * from Mapping where floor like '%L1%';
is giving the expected results.
csv文件的数据
V,M,Floor
1,15,L1
2,14,L1
3,14,L1
4,16,L1
5,16,L1
6,6,L1
7,14,L1
8,13,L1
9,12,L1
10,11,L1
11,16,L1
通常,我主张将数据加载到所有列均为字符串的登台表中,然后在数据库中进行清理。
但是,load data infile
确实具有一些不错的数据清理功能。如果多余的字符为空格,则可以使用trim()
。关键是变量和SET
:
LOAD DATA LOCAL INFILE "../.../mapping.csv"
INTO TABLE db.Mapping
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(@floor, . . . ) -- list the rest of the columns here
SET floor = TRIM(@floor);
如果错误更复杂,则正则表达式会有所帮助:
SET floor = REGEXP_REPLACE(@floor, '[^A-Z0-9]', '')
插入数据后,您始终可以修剪空白;
UPDATE db.Mapping SET floor = trim(floor);