栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PHP-使用LOAD DATA INFILE将CSV文件导入mysql数据库

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PHP-使用LOAD DATA INFILE将CSV文件导入mysql数据库

如果

echo($sql);
执行该操作,您会发现查询语法不正确,原因如下:

  1. 文件名应该用引号而不是反引号引起来,因为它是字符串文字而不是标识符。

  2. 绝对不需要调用

    mysql_escape_string()
    FIELDS TERMINATED BY
    and
    ENCLOSED BY
    ESCAPED BY
    子句中指定分隔符。

  3. 您过度使用了反引号。实际上,在您的情况下,由于没有使用保留字,因此请放弃所有保留字。它们只会增加混乱。

  4. 在CSV文件第一行的末尾,您 必须要

    ,,,
    使用它,因为将它们用作行定界符的一部分。如果您不这样做,则不仅会跳过第一行,还会跳过包含数据的第二行。

  5. 您不能

    ENCLOSED BY
    多次使用子句。您必须以
    Number
    不同的方式处理字段。

  6. 查看您不需要的示例行恕我直言

    ESCAPED BY
    。但是,如果您觉得自己需要它,可以像这样使用它
    ESCAPED BY '\'

话虽这么说,但句法正确的语句可能看起来像这样

LOAD DATA INFILE 'detection.csv'INTO TABLE calldetectionsFIELDS TERMINATED BY ','OPTIonALLY ENCLOSED BY '"' LINES TERMINATED BY ',,,rn'IGNORE 1 LINES (date, name, type, number, duration, addr, pin, city, state, country, lat, log)

现在,恕我直言,您需要在加载它们时转换很多字段:

  1. 如果
    date
    表中的
    datetime
    数据类型为数据类型,则需要对其进行转换,否则会出现错误

日期时间值不正确:行的“日期”列为“ 2013年9月18日01:53:45 PM”

  1. 您必须处理围绕

    Number
    字段值的单个qoutes

  2. 你最有可能要更改

    "null"
    字符串字面量实际
    NULL
    addr, pin, city, state, country

  3. 如果持续时间总是以秒为单位,则可以提取秒的整数值并将其存储在表中,以便以后可以轻松汇总持续时间值。

话虽这么说,该语句的有用版本应如下所示

LOAD DATA INFILE 'detection.csv'INTO TABLE calldetectionsFIELDS TERMINATED BY ','OPTIonALLY ENCLOSED BY '"' LINES TERMINATED BY ',,,rn'IGNORE 1 LINES (@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),    number = TRIm(BOTH ''' FROM @number),    duration = 1 * TRIm(TRAILING 'Secs' FROM @duration),    addr = NULLIF(@addr, 'null'),    pin  = NULLIF(@pin, 'null'),    city = NULLIF(@city, 'null'),    state = NULLIF(@state, 'null'),    country = NULLIF(@country, 'null')

以下是在我的机器上执行查询的结果

mysql>加载数据文件'/tmp/detection.csv'    ->进入表呼叫检测    ->以','结尾的字段    ->可选用““''封闭     ->以',,,  n'结尾的行    ->忽略1行     ->(@日期,名称,类型,@编号,@持续时间,@ addr,@ pin,@ city,@ state,@ country,lat,log)    ->设置日期= STR_TO_DATE(@date,'%b-%d-%Y%h:%i:%s%p'),    ->数字= TRIM(都是'''FROM @number),    ->持续时间= 1 * TRIM(从@duration跟踪'Secs'),    -> addr = NULLIF(@addr,'null'),    ->引脚= NULLIF(@pin,'null'),    ->城市= NULLIF(@city,'null'),    ->状态= NULLIF(@state,'null'),    ->国家= NULLIF(@ country,'null');查询正常,受影响的3行(0.00秒)记录:3已删除:0跳过:0警告:0mysql>从calldetections中选择*;+ --------------------- + --------- + --------------- +- ------------ + ---------- + ------ + ------ + ------ + ----- -+ --------- + ------ + ------ +| 日期| 名称| 类型 编号 持续时间 地址| 别针 城市| 州| 国家| lat | 日志|+ --------------------- + --------- + --------------- +- ------------ + ---------- + ------ + ------ + ------ + ----- -+ --------- + ------ + ------ +| 2013-09-18 13:53:45 | 未知 拨出电话| 123456 | 0 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 || 2013-09-18 13:54:14 | 未知 拨出电话| 1234567890 | 0 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 || 2013-09-18 13:54:37 | 未知 拨出电话| 14772580369 | 1 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 |+ --------------------- + --------- + --------------- +- ------------ + ---------- + ------ + ------ + ------ + ----- -+ --------- + ------ + ------ +设置3行(0.00秒)

最后在php中将查询字符串分配给

$sql
变量应如下所示

$sql = "LOAD DATA INFILE 'detection.csv'        INTO TABLE calldetections        FIELDS TERMINATED BY ','        OPTIonALLY ENCLOSED BY '"'         LINES TERMINATED BY ',,,\r\n'        IGNORE 1 LINES         (@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)        SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'), number = TRIm(BOTH ''' FROM @number), duration = 1 * TRIm(TRAILING 'Secs' FROM @duration), addr = NULLIF(@addr, 'null'), pin  = NULLIF(@pin, 'null'), city = NULLIF(@city, 'null'), state = NULLIF(@state, 'null'), country = NULLIF(@country, 'null') ";


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/398842.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号