PHP导入上千万CSV数据处理

背景

最近公司给到一张上千万的爬虫数据,需要把数据整理后导入数据库。

    1. csv处理的核心代码
 /**
     * @param int $offset 导入起始行数
     * @param string $fileName 导入的文件
     * @param int $lines 导入行数
     * @return array|bool
     */
    public function importCvs($offset=0,$fileName='digikey_sample_1000_0922',$lines=1000)
    {
        $csvfile = base_path() . "/" .$fileName .".csv";//文件路径

        if (!$fp = fopen($csvfile, 'r')) {
            return false;
        }
        $i = $j = 0;
        while (($line = fgets($fp)) !==false) {
            if ($i++ < $offset) {
                continue;
            }
            break;
        }
        $data = array();
        while (($j++ < $lines) && !feof($fp)) {
            if($info = fgetcsv($fp)){
                foreach ($info as $key => $item) {
                    $info[$key] = iconv("GBK", "UTF-8", $item);//这里必须转码,不然会乱码
                }
                $data[] = $info;
            }

        }
        fclose($fp);
//        dd($data);
        return $data;
    }

  • 2.业务数据处理
   /**
     * 数据处理
     */
    public function importCsvToDb()
    {
        $j = 0;
        $line = 1000;//批量数
        for ($i=1;$i<13500;$i++){
            $data = $this->importCvs($j,'digikey_sample_1000_0922',$line);
            //TODO 插入数据库
            if(!$data) break;
            $fields = ['url','category1','category2','category3','category4','categories','name','image','part_number','manufacturer','manufacturer_number','detailed_description','description','manufacturer_standard_leadtime','detail_description','datasheet_url','in_stock','factory_stock','marketplace_stock','price','product_attributes','environmental','additional_resources','updated'];
            $insert = [];
            if(is_array($data)){
                foreach ($data as $key=> $value){
                    foreach ($value as $k => $v){
                        if(isset($fields[$k])) $insert[$key][$fields[$k]] = $v;
                    }
                }
            }

            if($insert){
                $ret = (new LcscDigikeyModel())->insert($insert);
            }
            $insert && $ret = (new LcscDigikeyModel())->insert($insert);

            var_dump('------$j---------');
            var_dump($j);

            var_dump('------cnt---------');
            var_dump(count($data));

            var_dump('---ret--');
            var_dump($ret);
            var_dump("<pre><pre>");

            unset($insert,$data);

            $j = $line * $i;
        }
        dd('end successful');
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值