文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

php 使用 yield 批量处理文件并读取大数据导入数据库

2023-09-08 18:17

关注

生成器的核心是一个 yield 关键字,使用yield php会返回一个属于Generator类的对象,这个对象可以使用foreach()函数进行迭代,
官方文档解释:yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。

declare (strict_types = 1);namespace app\command;use think\console\Command;use think\console\Input;use think\console\input\Argument;use think\console\input\Option;use think\console\Output;use PhpOffice\PhpSpreadsheet\IOFactory;use PhpOffice\PhpSpreadsheet\Writer\Xlsx;use PhpOffice\PhpSpreadsheet\Spreadsheet;use think\facade\Db;use think\facade\Log;class Test extends Command{    protected function configure()    {        // 指令配置        $this->setName('test')            ->setDescription('the test command');    }    protected function execute(Input $input, Output $output)    {        set_time_limit(0);        ini_set("memory_limit", "-1");        $dir = app()->getRuntimePath() . '资源文件夹';        try {        // 获取遍历的全部文件            $list = $this->openAllDir($dir);            $i = 1;            foreach ($list as $item) {                if (file_exists($item) && is_file($item)) {                    // 这里开始读取文件内容                    $output->writeln("正在读取第 {$i} 个文件 {$item}");                    $res = $this->readImportFile($item);                    $is_err = false;                    // 处理读取到的数据并插入数据库                    foreach ($res as $k => $re) {                        if (empty($re[0])) {continue;                        }                        foreach ($re as &$v) {$v = $v && is_string($v) ? addslashes($v) : '';                        }                        unset($v);                        if (isset($re[15])) {$re[15] = intval($re[15]);                        }                        // 去掉重复名称数据                        $exists = Db::name('xxx')->where('name', $re[0])->count();                        if ($exists) {continue;                        }                        $sql = "INSERT INTO `xxx`(`id`, `name`, `business_status`, `legal_representative`, `registered_capital`, `paid_in_capital`, `date_of_incorporation`, `approval_date`, `business_term`, `province`, `city`, `county`, `credit_code`, `identification_number`, `registration_no`, `organization_code`, `number_of_insured_persons`, `company_type`, `industry`, `name_used_before`, `registered_address`, `new_report_address`, `website`, `contact_number`, `other_number`, `email`, `other_email`, `nature_of_business`) VALUES (null , '{$re[0]}', '{$re[1]}', '{$re[2]}', '{$re[3]}', '{$re[4]}', '{$re[5]}', '{$re[6]}', '{$re[7]}', '{$re[8]}', '{$re[9]}', '{$re[10]}', '{$re[11]}', '{$re[12]}', '{$re[13]}', '{$re[14]}', '{$re[15]}', '{$re[16]}', '$re[17]', '$re[18]', '$re[19]', '$re[20]', '$re[21]', '$re[22]', '$re[24]', '$re[25]', '$re[26]', '$re[27]');";                        $res = Db::execute($sql);                        if (!empty($res)) {$output->writeln("{$item} 文件添加第 ". ($k+1) ." 条记录成功!" . PHP_EOL);                        } else {$is_err = true;$output->writeln("{$item} 文件添加第 ". ($k+1) ." 条记录添加失败!记录log" . PHP_EOL);                        }                    }                    if ($is_err) {                        $output->writeln("读取第 {$i} 个文件 {$item} 失败!");                    }                    $i++;                }            }        } catch (\Exception $e) {            $output->writeln('error:'. $e->getMessage());        }        // 指令输出        $output->writeln('end');    }// 读取文件    protected function readImportFile($file)    {        $inputFileType = IOFactory::identify($file);        $objReader = IOFactory::createReader($inputFileType);        $worksheetNames = $objReader->listWorksheetNames($file);        // 只读取表格数据,忽略里面的各种格式,否则会内存耗尽        $objReader->setReadDataOnly(TRUE);        $objReader->setLoadSheetsOnly($worksheetNames[0]);        $objPHPExcels = $objReader->load($file);        $maxCol = $objPHPExcels->getSheet(0)->getHighestColumn(); // 总列数        $maxRow = $objPHPExcels->getSheet(0)->getHighestRow(); // 总行数        for ($i = 4; $i <= $maxRow; $i++) {            // 读取一行            yield $objPHPExcels->getSheet(0)->rangeToArray('A' . $i . ':' . $maxCol . $i)[0];        }    }// 遍历文件夹,因为 yield 好像无法递归所以一个一个文件夹遍历    protected function openAllDir($dir)    {        // 读取文件夹下全部文件        if (is_dir($dir)) {            if ($dh = opendir($dir)) {                while (($file = readdir($dh)) !== false) {                    if ($file != '.' && $file != '..') {                        $name = $dir . '/' . $file;                        if (is_dir($name)) {if ($dh2 = opendir($name)) {    while (($file2 = readdir($dh2)) !== false) {        if ($file2 != '.' && $file2 != '..') {            $name2 = $name . '/' . $file2;            if (is_dir($name2)) {                if ($dh3 = opendir($name2)) {                    while (($file3 = readdir($dh3)) !== false) {                        if ($file3 != '.' && $file3 != '..') {$name3 = $name2 . '/' . $file3;if (is_dir($name3)) {    if ($dh4 = opendir($name3)) {        while (($file4 = readdir($dh4)) !== false) {            if ($file4 != '.' && $file4 != '..') {                $name4 = $name3 . '/' . $file4;                if (is_dir($name4)) {                    // end                } else {                    if (strrchr($name4, '.') == '.xlsx') {                        yield $name4;                    }                }            }        }    }} else {    if (strrchr($name3, '.') == '.xlsx') {        yield $name3;    }}                        }                    }                }            } else {                if (strrchr($name2, '.') == '.xlsx') {                    yield $name2;                }            }        }    }}                        } else {if (strrchr($name, '.') == '.xlsx') {    yield $name;}                        }                    }                }                closedir($dh);            }        }    }}

来源地址:https://blog.csdn.net/qq_27080351/article/details/127301894

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯