首页 > 解决方案 > 如何避免在将数据从 csv 文件导入 MySQL 表时创建空格

问题描述

您好我正在将数据从 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

标签: mysqlsqlcsv

解决方案


通常,我主张将数据加载到所有列都是字符串的暂存表中,然后在数据库中进行清理。

但是,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]', '')

推荐阅读