2022-11-02

一行一行读文本写入MySql

文本内容(约45万行)

prefix	phone	province	city	isp	post_code	city_code	area_code
130	1300000	山东	济南	联通	250000	0531	370100
130	1300001	江苏	常州	联通	213000	0519	320400
130	1300002	安徽	巢湖	联通	238000	0551	340181
130	1300003	四川	宜宾	联通	644000	0831	511500
130	1300004	四川	自贡	联通	643000	0813	510300
130	1300005	陕西	西安	联通	710000	029	610100
130	1300006	江苏	南京	联通	210000	025	320100
130	1300007	陕西	西安	联通	710000	029	610100
130	1300008	湖北	武汉	联通	430000	027	420100
130	1300009	陕西	西安	联通	710000	029	610100
130	1300010	北京	北京	联通	100000	010	110100
......

一行一行读取入库

    function test()
    {
        for ($i = 1; $i <= 45; $i++) {
            $file = './phone_area.txt';
            $fp = fopen($file, 'r') or die("open file failure!");

            $line_begin = ($i - 1) * 10000 + 1;
            $line_end = $i * 10000;
            $line_num = 1;
            $insert = [];
            while (!feof($fp) && $line_num <= $line_end) {
                if ($line_end >= $line_num && $line_num >= $line_begin) {
                    $line = fgets($fp, 1024);     //每读取一行
                    //echo $line_begin .'||'. $line_end . ' line_num: ' . $line_num . ' -> '.$line. PHP_EOL;
                    $insert[] = explode("\t", $line);
                } else {
                    //echo $line_begin .'|---------------|'. $line_end . ' line_num: ' . $line_num . ' -> '.$line. PHP_EOL;
                    fgets($fp, 1024);
                }
                $line_num++;
            }
            if ($i == 1) unset($insert[0]);
            fclose($fp);//关闭文件
            $sql = 'INSERT INTO phone_city (prefix,phone_area,province,city,isp,post_code,city_code,area_code,create_time) VALUES ';
            $values = '';
            $time = time();
            foreach ($insert as $item) {
                $values .= '(';
                $temp = '';
                foreach ($item as $j => $val) {
                    if ($j == 7) {
                        $temp .= '"' . (int)$val . '",';
                    } elseif (in_array($j, [0, 1])) {
                        $temp .= (int)$val . ',';
                    } else {
                        $temp .= '"' . $val . '",';
                    }
                }
                $temp .= $time;
                $temp .= '),';
                $values .= $temp;
                //$values .= '),';
            }
            $values = rtrim($values, ',');
            $sql .= $values;
            //echo 'SQL: '. $sql. PHP_EOL;
            echo "第 $i 次 " . PHP_EOL;
            try {
                $res = Yii::$app->db->createCommand($sql)->execute();
                echo '成功数: ' . ($res). PHP_EOL;
            } catch (Exception $e) {
                echo 'Exception: ' . $e->getMessage(). PHP_EOL;
                file_put_contents("_20221102.txt", "Exception:   {$e->getMessage()} . \n\n", FILE_APPEND);
                exit;
            }
            echo PHP_EOL;
            sleep(1);
        }
        exit;
    }

SQL语句

DROP TABLE  IF EXISTS phone_city;
CREATE TABLE `phone_city` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `prefix` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '前缀',
  `phone_area` int(10) NOT NULL DEFAULT '0' COMMENT '号段',
  `province` varchar(32) NOT NULL DEFAULT '' COMMENT '所属省份',
  `city` varchar(32) NOT NULL DEFAULT '' COMMENT '所属城市',
  `isp` varchar(32) NOT NULL DEFAULT '' COMMENT '运营商',
  `post_code` varchar(32) NOT NULL DEFAULT '' COMMENT '邮编',
  `city_code` varchar(8) NOT NULL DEFAULT '' COMMENT '电话区号',
  `area_code` varchar(32) NOT NULL DEFAULT '' COMMENT '区域编码',
  `create_time` int(10) NOT NULL DEFAULT '0' COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `un_phone_area` (`phone_area`),
  KEY `idx_phone_area` (`phone_area`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

发表回复

Your email address will not be published. Required fields are marked *