文本内容(约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;