php利用生成器yield读取较大csv文件
2019-11-14 本文已影响0人
苦涩的羽
生成器yield真是个好东西,可以每次只读取文件中一行的内容,不占用宝贵的内存资源
function getRows($file)
{
if(!file_exists($file))
{
die("文件不存在");
}
$handle = fopen($file, 'rb');
if($handle === false)
{
throw new Exception('open file error');
}
while(feof($handle) === false)
{
yield fgetcsv($handle);
}
fclose($handle);
}
//转换编码格式,预防中文乱码
function convert_arr($arr)
{
return array_map(function($v){
return mb_convert_encoding($v,'utf-8','gb2312');
}, $arr);
}
foreach(getRows("abc.csv") as $k=>$row)
{
if(is_array($row))
{
$row = convert_arr($row);
file_put_contents("a.txt", json_encode($row,JSON_UNESCAPED_UNICODE)."\r\n", FILE_APPEND);
}
}