【问题标题】:How to avoid white spaces being created while importing data from csv file to MySQL table如何避免在将数据从 csv 文件导入 MySQL 表时创建空格
【发布时间】:2020-04-07 15:59:02
【问题描述】:

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

【问题讨论】:

  • 参见manuals中的“输入预处理”
  • 看第二个答案here
  • 您可能希望共享几行示例数据,这会导致记录给您带来麻烦。
  • 我有一个csv文件,可以在这里附加一个csv文件吗?
  • @Abecee 添加了相同的数据

标签: mysql sql csv


【解决方案1】:

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

不过,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]', '')

【讨论】:

  • 不确定这是否重要 - 但根据docs,列列表应位于SET之前
  • REGEXP_REPLACE 在我的 MySQL 版本中不起作用 ->mysqld Ver 5.7.28-0
【解决方案2】:

您可以在插入数据后随时修剪空白;

UPDATE db.Mapping SET floor = trim(floor);

【讨论】:

    猜你喜欢
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2015-12-30
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多