PHP 50W 条记录 EXCEL 文件导入数据库求指导下方法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jd186
V2EX    PHP

PHP 50W 条记录 EXCEL 文件导入数据库求指导下方法

  •  
  •   jd186 2018-04-11 10:33:58 +08:00 6040 次点击
    这是一个创建于 2743 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据库表有 50W 左右的记录。每条记录有 300 的个的字段。

    要以 EXCEL 或者 CSV 形式的文件批量导入数据库。

    我用 PHPEXCEL 做导入时一直报错。文件都打不开。求大神指导下。谢谢

    37 条回复    2018-04-19 16:51:07 +08:00
    greed1is9good
        1
    greed1is9good  
       2018-04-11 10:39:00 +08:00 via Android
    每条记录 300 个字段。。。。
    服。。。
    vincenttone
        2
    vincenttone  
       2018-04-11 10:39:57 +08:00
    保存成 csv,然后 php 或者 shell 直接读文件,按行读取,别一口气载入内存,读取几百条就往数据库塞一次,没塞进去的记录一下。
    jd186
        3
    jd186  
    OP
       2018-04-11 10:40:10 +08:00
    @greed1is9good 确实是这样是一个汽车配件关联表。他 300 多个字段全是配件关联 ID。很奇葩
    lbp0200
        4
    lbp0200  
       2018-04-11 10:40:52 +08:00
    你为什么不说 PHP 爆出的错误信息?
    b821025551b
        5
    b821025551b  
       2018-04-11 10:42:36 +08:00
    用 csv 然后按行读文件吧,PHPEXCEL 一下子导入那么多会爆炸的。
    yogogo
        6
    yogogo  
       2018-04-11 11:04:14 +08:00
    yield 了解下
    YMB
        7
    YMB  
       2018-04-11 11:08:10 +08:00
    建议解决方案:
    1.看看有没有支持将 Excel 转换为 sql 语句的工具。
    2.看看有没有支持将 Excel 导入到数据库的工具,不知道 navigate 是否支持。
    3.看看有没有工具能分割 Excel,多跑几次。
    4.PHP 语言本身没问题,看咋用。
    jimmyczm
        8
    jimmyczm  
       2018-04-11 11:09:58 +08:00   1
    之前我是用 access 将数据库里面的导出来,再转成相应的文件
    cdwyd
        9
    cdwyd  
       2018-04-11 11:12:48 +08:00 via Android
    必须用 php 吗?
    不是的话用 load from 这个数据量很容易
    sarices
        10
    sarices  
       2018-04-11 11:19:42 +08:00
    navicat
    lsls931011
        11
    lsls931011  
       2018-04-11 11:20:06 +08:00   1
    使用 PHP 每一次读取几百条记录然后放入 redis 的队列里面, 再使用另外一个 PHP 进程读取 redis 并放入数据库。 如果怕内存暴涨, 可以判断队列长度,等待队列的数据被读取完了, 再放入队列里面,继续工作. 50W 数据你直接使用 PHPExcel 然后 foreach 去读取,php 可能会因为耗时太久报错了
    houshengzi
        12
    houshengzi  
       2018-04-11 11:21:32 +08:00
    生成器,了解一下
    gouchaoer
        13
    gouchaoer  
       2018-04-11 11:31:31 +08:00
    用 csv 一次读取一部分数据,然后导入数据库
    mylopk
        14
    mylopk  
       2018-04-11 11:32:57 +08:00
    mysql load data file,整个文件导入,一条 sql 语句解决
    mosliu
        15
    mosliu  
       2018-04-11 11:39:41 +08:00
    不熟悉 php
    不过感觉可以用工具来做啊
    用 navicat 这个应该没问题。。。
    Mac
        16
    Mac  
       2018-04-11 12:02:17 +08:00
    @b821025551b 没那么恐怖,我 I3 的机器,8G 内存,用 PHPEXCEL 导 5W 条记录,几乎是秒倒的
    tomczhen
        17
    tomczhen  
       2018-04-11 12:02:48 +08:00 via Android
    上传文件,把 CSV / excel 当数据库来操作。
    akira
        18
    akira  
       2018-04-11 12:22:18 +08:00
    @Mac 加载都不能秒加载吧,何况是导入到库里面。

    @jd186 本地想办法把 excel 文件转化成 csv 格式或者处理成 sql,再来做到数据库的导入动作。不要拿着个 php 就到处敲
    lianxiaoyi
        19
    lianxiaoyi  
       2018-04-11 12:27:47 +08:00
    50 万数据量并不大啊。。。。。就内存稍微大点吧 。加根内存条解决啊。。。。云服务器暂时买一台内存比较大的服务器就好了啊。。。然后用 cli 模式导入。。。。
    Mac
        20
    Mac  
       2018-04-11 12:38:34 +08:00
    @akira 可能是我的列数没他这么夸张,我大概是 10 列。excel 文件里有很多暗桩的,有些\n \r 你导出成 csv 还是有,我就吃过这个暗亏,groupby 出来看上去是相同的,其实是不同的。还是用 php 过滤处理一下比较干净。
    moro
        21
    moro  
       2018-04-11 12:47:33 +08:00
    用 Navicat,可以直接导入 excel
    heretreeli
        22
    heretreeli  
       2018-04-11 12:50:20 +08:00
    Navicat +1
    fortunezhang
        23
    fortunezhang  
       2018-04-11 16:16:44 +08:00
    我一般是用 python 读取 excel 文件,然后一次读取一条,组织成 sql,写入一个 sql 文件中,然后 mysql source 一下。
    Bisn
        24
    Bisn  
       2018-04-11 16:45:07 +08:00
    Perl
    yujieyu7
        25
    yujieyu7  
       2018-04-11 16:55:41 +08:00
    估计是一次性读取入内存做写入的,这个数据量,一个字段 10 字节,都 50w*300*10B,小 1.4g 。

    自己写个脚本,一行行的读取导入吧
    wingoo
        26
    wingoo  
       2018-04-11 16:59:57 +08:00
    load data 最快的
    xiaoyang7545
        27
    xiaoyang7545  
       2018-04-11 17:09:44 +08:00
    直接 navicat 可以的话就 navicat,如果实在需要 php。请分段用 csv。用 xls 的格式+phpexcel 效率非常低下。你这个估计是超出内存限制了。
    tegic
        28
    tegic  
       2018-04-11 17:12:25 +08:00
    lihongjie0209
        29
    lihongjie0209  
       2018-04-11 17:52:22 +08:00
    forkjoin thread pool 了解一下.
    本质上也是切割文件然后多线程插入数据库.
    silencefent
        30
    silencefent  
       2018-04-11 18:00:41 +08:00
    干嘛不用工具呢,mysqlfront 十分钟之内搞掂
    liujinsong668
        31
    liujinsong668  
       2018-04-11 20:35:50 +08:00
    生成器,了解下
    wwww961h
        32
    wwww961h  
       2018-04-11 22:22:18 +08:00
    用工具吧,最简单了,navicat
    ericgui
        33
    ericgui  
       2018-04-12 05:41:44 +08:00
    DavidNineRoc
        34
    DavidNineRoc  
       2018-04-12 07:35:09 +08:00 via Android
    使用 excl 转化成 csv,现在很多数据库可以直接把 csv 转成表,变成表之后再做字段的修改之类的
    dy7338
        35
    dy7338  
       2018-04-16 18:00:37 +08:00
    数据库可以直接导入 excel 格式的
    jourdon
        36
    jourdon  
       2018-04-19 16:48:18 +08:00
    300 个字段还放一个表里,历害了。。。
    jourdon
        37
    jourdon  
       2018-04-19 16:51:07 +08:00
    用 SplFileObject 来读取吧,几万条写一次,速度很快,我试过 50 万条数据 不到一分钟搞定
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2988 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 13:46 PVG 21:46 LAX 06:46 JFK 09:46
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86