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("
");

            unset($insert,$data);

            $j = $line * $i;
        }
        dd('end successful');
    }

你可能感兴趣的:(php,开发语言)