【问题标题】:Ignore specific comma in timestamp using LOAD DATA INFILE?使用 LOAD DATA INFILE 忽略时间戳中的特定逗号?
【发布时间】:2015-09-16 08:37:47
【问题描述】:

我有大量格式如下的 CSV 文件:

    2015/06/29,13:00,1,194,36,390

正如您可能看到的,我需要忽略上例中分隔“2015/06/29”和“13:00”的逗号。

目前这是我的 sql 命令的样子:

    LOAD DATA local INFILE '"!new!"' IGNORE into table db.table COLUMNS TERMINATED BY ',' IGNORE 3 LINES (@when,col2,col3,col4,col5) SET when=STR_TO_DATE(@when,'%Y/%m/%d %H:%i')" -u user -ppass

所有内容都导入,除了那个讨厌的逗号将所有内容都丢掉一列。

显然我可以将两者都导入单独的列,但它们都需要进入一个 DATETIME 格式的列。任何人都知道我将如何跳过那个箍?

【问题讨论】:

  • 你不能。没有办法告诉mysql“这是一个逗号分隔符”,“这是一些看起来像逗号的垃圾,忽略它”。都是逗号。导入到带有两个日期/时间组件的额外字段的临时表,然后选择永久表,结合这两个值。然后去殴打谁/什么产生了错误的 csv。
  • 或者,将前两个字段加载到两个单独的用户定义变量中,并使用CONCAT()函数将它们组合起来。然后通过STR_TO_DATE 运行返回,就像你已经在做的那样。 (我不确定为什么这个问题会被否决。)

标签: mysql csv import load-data-infile


【解决方案1】:

您无需“忽略”逗号。只需将这两个字段导入到两个单独的用户定义变量中,然后将它们连接成列的单个值。

将日期部分放入用户定义的变量中,就像您已经在做的那样:@whendt

把第二个字段,时间部分,放入一个second用户自定义变量:@whentm

SET 子句中,使用CONCAT 函数将这两个变量连接在一起。

  CONCAT(@whendt, ' ', @whentm)

例如:

 LOAD DATA local INFILE '"!new!"' 
 IGNORE 
 INTO table db.table 
 COLUMNS TERMINATED BY ',' 
 IGNORE 3 LINES 
 ( @whendt    -- first column is date portion
 , @whentm    -- second column is time portion
 , col2
 , col3
 , col4
 , col5 
 )
 SET when = STR_TO_DATE( CONCAT(@whendt,' ',@whentm) ,'%Y/%m/%d %H:%i')

【讨论】:

  • 该死!我永远不会想到这一点。你是了不起的斯宾塞!
  • @JubJub24:您已经对用户定义的变量进行了赋值,并且已经确定了 SET 子句中的函数。你已经在那里了。我认为你只是挂断了“忽略逗号”的想法。 Marc B 和 tadman 都是对的……没有办法让 LOAD DATA 忽略第二个逗号。他们是绝对正确的。让 LOAD DATA 使用此文件的技巧是使用 逗号,而不是 反对 它。
  • 那是一些非常禅宗的东西。我会是一个逗号:)
  • 我有 LOAD DATAevery 字段放入用户定义变量的语句。对于我想忽略的字段,我使用名为 @dummy 的变量。而且我可以在SET 子句中构建一些可怕的 horrendous 表达式、条件测试、连接、替换讨厌的美元符号字符、用 NULL 替换空字符串等。用户定义的变量和构建表达式是 Zen 的所在。 (你已经禅了。)
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 2021-02-02
  • 2018-04-20
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多