今天在做项目时需要导入一个有2万多条数据的excel文件,并且还要对其进行处理然后存进数据库。然而2万多条。做了一天还没完成。后来经过上级的提点,如果导入的并不是excel文件呢,因为excel文件读取出来的是以数组形式,读取时会占用大量的内存导致服务器运行缓慢,最后php运行时间过长而炸掉了
CSV
之前之所以一直使用excel文件进行导入,因为我们可以根据excel的首行标题进行对列数据方便读取,然而读取时占用内存过大却是一个毛病。
之前在学python读取数据的时候用过一种csv格式的表格文件,作用跟excel差不多,但是读取时数据是以,形式形成的字符串隔开的,而我们只要在使用的时候使用explode将数据转化成数组形式就可以了,减轻了服务器的负担,加快读取速度。
对于读取单表大数据的时候使用csv进行读取无疑是一种高效的选择
实例
//获取打开文件的excel office版本
$type = \Our\PHPExcel::getExcelType($_FILES['upfile']['name']);
$reader = PHPExcel_IOFactory::createReader($type);
$excelObj = $reader->load($_FILES['upfile']['name']);
$sheet = $excelObj->getSheet();
$maxRow = $sheet->getHighestRow();//最大行数
$maxCol = $sheet->getHighestColumn();//最大列数
for ($i = 2; $i <= $maxRow; $i ++) {
$data = array();
for ($j = 'A'; $j <= $maxCol; $j ++) {
//列名
$col_name = $excelObj->getActiveSheet()->getCell("$j".'1' )->getValue();
//各单元格的值
$val = $excelObj->getActiveSheet()->getCell("$j$i")->getValue();
//根据列名拼接数组
switch ($col_name) {
case '账号':
$data['user_name'] = $val;
break;
case '手机号码':
$data['mobile'] = $val;
break;
default:
break;
}
}
//添加至数据库中,具体写法根据需要
}
//删除文件
unlink($_FILES['upfile']['name']);
使用excel时我们需要上传文件,并且使用phpexcel进行读取,这对于只有1000多条的数据来说是没有什么问题的,但是现在读取的是2万条数据的excel文件,因此使用这个的时候,运行到reader的时候就因为运行时间过长而导致代码中断了。而将文件改为csv之后,使用fopen进行读取:
$file_name = '导入模板.csv';
$fp = fopen($file_name, 'r');
$i = 0;
while (!feof($fp)) {
$line = explode(',', fgets($fp));
$line = array_map(function ($v) {
return trim($v);
}, $line);
if (empty($line[0])) {
continue;
}
$data = [];
$data['user_name'] = $line[0];
$data['mobile'] = $line[3];
//添加至数据库中,具体写法根据需要
echo $i++. '_'. $data['user_name']. '|';
try {
//添加至数据库中,具体写法根据需要
} catch (\Exception $e) {
echo $e->getMessage();
}
}
fclose($fp);
读取速度加快了,但是对于将2万多条存进数据库中所需时间还是不容小觑,至少不会在还没读取到文件就中断了,因此使用csv进行读取后,还需要使用命令行运行该php文件