我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

生成器的核心是一个 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

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么使用Golang并发读取文件数据并写入数据库

本篇内容介绍了“怎么使用Golang并发读取文件数据并写入数据库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!项目结构data文件夹中包含数
2023-07-02

使用DataGrip创建数据库并读取sql文件

DataGrip是由 JetBrains 公司生产的又一个强大且优秀的数据库管理工具。它支持几乎所有的主流的关系数据库产品。对于一些习惯使用Navicat来说,使用DataGrip不太习惯。下面我通过DataGrip 2023.1创建数据库
2023-08-17

如何使用批处理文件异地备份数据库

这篇文章主要讲解了“如何使用批处理文件异地备份数据库”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用批处理文件异地备份数据库”吧!为了保障服务器中数据的可恢复性,采用异地备份数据库方案
2023-06-09

提升数据处理效率:使用pandas读取Excel文件的技巧

优化数据处理流程:Pandas读取Excel文件的技巧引言:在数据分析和处理的过程中,Excel是最常见的数据来源之一。然而,Excel文件的读取和处理往往是效率较低的,特别是当数据量较大时。为此,本文将介绍如何使用Python的Pand
提升数据处理效率:使用pandas读取Excel文件的技巧
2024-01-24

如何使用命令行轻松将大型 SQL 数据库文件导入 MySQL

将大型 sql 数据库文件导入 mysql 似乎令人畏惧,但使用正确的命令实际上非常简单。在这篇文章中,我们将逐步引导您完成整个过程。将大型 sql 数据库文件导入 mysql 的分步指南:1.打开命令提示符打开命令提示符。您可以通过按
如何使用命令行轻松将大型 SQL 数据库文件导入 MySQL
2024-07-12

使用 Kafka 使用队列处理 csv 文件以插入到 postgres 数据库并返回状态消息

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《使用 Kafka 使用队列处理 csv 文件以插入到 postgres 数据库并返回状态消息》带大家来了解一下##content
使用 Kafka 使用队列处理 csv 文件以插入到 postgres 数据库并返回状态消息
2024-04-05

计算机处理的文件及数据读入到哪里才能被 CPU 使用

小编给大家分享一下计算机处理的文件及数据读入到哪里才能被 CPU 使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!计算机处理的文件及数据,只有读入“内存”后才能
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录