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

    }

}

上一篇下一篇

猜你喜欢

热点阅读