【问题标题】:mysql cannot import csv lines terminated with \r\n\r\n using load data localmysql 无法使用本地加载数据导入以 \r\n\r\n 结尾的 csv 行
【发布时间】:2018-10-23 12:46:27
【问题描述】:

我正在尝试导入CSV provided by a service that should give me cities database

csv格式城市的方式格式为:

CC_FIPS FULL_NAME_ND
AN  Aixas

AN  Aixirivall

AN  Aixovall

AN  Andorra la Vella

AN  Ansalonga

所以我想出了以下mysql查询:

LOAD DATA LOCAL
INFILE 'GEODATASOURCE-CITIES-FREE.TXT'
INTO TABLE `city`
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(cc_fips,full_name_nd);

它们都被导入,但full_name_nd 列下的条目后面有一个空格。正如您所见,每行末尾都有额外的\r\n

我可以通过cat short.txt | od -c 确认

0000000   C   C   _   F   I   P   S  \t   F   U   L   L   _   N   A   M
0000020   E   _   N   D  \r  \n   A   N  \t   A   i   x   a   s  \r  \n
0000040  \r  \n   A   N  \t   A   i   x   i   r   i   v   a   l   l  \r
0000060  \n  \r  \n   A   N  \t   A   i   x   o   v   a   l   l  \r  \n
0000100  \r  \n   A   N  \t   A   n   d   o   r   r   a       l   a
0000120   V   e   l   l   a  \r  \n  \r  \n   A   N  \t   A   n   s   a
0000140   l   o   n   g   a  \r  \n  \r  \n   A   N  \t   A   n   y   o
0000160   s  \r  \n  \r  \n   A   N  \t   A   r   a   n   s  \r  \n  \r
0000200  \n   A   N  \t   A   r   i   n   s   a   l  \r  \n  \r  \n   A
0000220   N  \t   A   u   b   i   n   y   a  \r  \n  \r  \n   A   N  \t

所以修改查询,使用\r\n\r\n:

LOAD DATA LOCAL
INFILE 'GEODATASOURCE-CITIES-FREE.TXT'
INTO TABLE `city`
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\r\n\r\n'
IGNORE 1 LINES
(cc_fips,full_name_nd);

但该查询不起作用:(

Query OK, 0 rows affected (0.40 sec)
Records: 0  Deleted: 0  Skipped: 0  Warnings: 0

我什至尝试过

LOAD DATA LOCAL
INFILE 'GEODATASOURCE-CITIES-FREE.TXT'
INTO TABLE `city`
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(cc_fips,@col_with_spaces)
SET full_name_nd = TRIM(@col_with_spaces);

但显然,TRIM() 不适用于 \r\n 或其他特殊空格。

希望有人能提供帮助。

问候,

【问题讨论】:

    标签: mysql csv load-data-infile eol


    【解决方案1】:

    不确定这是否可行,因为我尚未对其进行测试,但您是否尝试过替换特殊字符。像这样的:

    LOAD DATA LOCAL
    INFILE 'GEODATASOURCE-CITIES-FREE.TXT'
    INTO TABLE `city`
    FIELDS TERMINATED BY '\t'
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES
    (cc_fips,@col_with_spaces)
    SET full_name_nd = TRIM(REPLACE(@col_with_spaces, '\r\n', ''));
    

    如果不起作用,请尝试使用 '\n' 而不是 '\r\n'。

    【讨论】:

    • 感谢您的检查。
    • @TheWolf,在 DOS/Windows 机器上创建的文本文件的行尾与在 Unix/Linux 上创建的文件不同。您从 GeoDataSource 获得的文件可能是在带有“\r\n”的 DOS 环境中生成的。因此,在其上运行 dos2unix 解决了行尾问题。你也可以用 unix2dos 做其他方式。
    【解决方案2】:

    已解决。 在使用我在问题中发布的 SQL 查询之前,首先在 'GEODATASOURCE-CITIES-FREE.TXT' 上使用 dos2unix 工具解决了它。期待任何可以解释为什么将其转换为unix 行尾解决它的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      相关资源
      最近更新 更多