PHP实现导入大量CSV数据的示例代码

PHP实现导入大量CSV数据的示例代码

目录

前言

代码部分

一. controller 写法

二. yield 读取数据以及处理空行方法

结论

知识点补充

前言

网上有很多介绍大量上传数据的,感觉都是一个抄一个,这是自己写的处理方式,在一些项目中已经应用.

主要利用 yield 完成文件读取,这个重点看会了,其他基本就很简单.

代码部分 一. controller 写法 //获取请求的参数 $arrayParams = Request::all(); $objCsvFile = $arrayParams['csv_file']; $strRealPath = $objCsvFile->getRealPath();//tmp路径, 这里可以先保存到自己预定路径,再进行读取 //**************重点在这一步********************// $glob = CommonUtilFunction::readPathCsvFile($strRealPath); //********************************************// $intRowNum = 0; while($glob->valid()) { $arrayNewLineData = []; $intRowNum++; if (1 === $intRowNum) { //第一行跳过,一般是标题 $glob->next(); continue; } $arrayLineData = $glob->current(); //处理空字符串 空行 /** * 一般csv有两种行数据可以被认为是空行 * 第一种 ',,,,,,,,,,,,,,,,,,,,,,,,,,',类似这种纯逗号没有任何数据 * 第二种 ' ',是真的空行,什么也没有 * 处理完成返回一个统一的数组 [] */ $arrayLineData = CommonUtilFunction::dealCsvLineData($arrayLineData); //跳过空行 if (true === empty($arrayLineData)) { $glob->next(); continue; } //自己的代码逻辑 ... // 避免意外错误 unset($arrayNewLineData); $glob->next(); // 处理下一行数据 } 二. yield 读取数据以及处理空行方法 /** * @description 迭代器读取csv文件 * @param $strCsvPath * @return \Generator */ public static function readPathCsvFile($strCsvPath) { if ($handle = fopen($strCsvPath, 'r')) { while (!feof($handle)) { yield fgetcsv($handle); } fclose($handle); } } /** * @description 处理c单行信息 * @param $arrData * @return \Generator */public static function dealCsvLineData($arrData = []) { $arrAfterData = []; if (false === empty($arrData)) { //去除每个字符串 前后空格 foreach ($arrData as &$colData) { //检测对应编码格式 csv文件格式Shift-JIS $strEncodeType = mb_detect_encoding($colData, ['UTF-8', 'Shift-JIS']); //如果认为utf-8格式不用转码, shift-jis格式需要转为utf8格式 if ('SJIS' === $strEncodeType) { //jis=>utf8 $colData = mb_convert_encoding($colData, 'UTF-8', 'Shift-JIS'); } $colData = trim($colData); } //去除空行 $isEmptyRow = true; foreach ($arrData as $item) { if ('' !== $item) { $isEmptyRow = false; break; } } if (false === $isEmptyRow) { $arrAfterData = $arrData; } } return $arrAfterData; } 结论

使用 yield 可以很大程度上减低服务器开销,压力在数据库方面。上限没有测试过,不过 1 万条数据是很轻松.

知识点补充

yield是php5.6版本才有的函数,作用是实现生成器,作用的在读取文件的时候,可以一行一行的读取

简单的说可以理解为 php版本的非缓冲查询,意思即是 把数据一行行 读取到php运行内存,并非一次性读取到php运行内存,众所周知,php有很多内置函数,可以帮助我们对数据进行加工操作,因为数据都在内存里面,所以能操作,但是php的运行内存是有极限,默认128M。

以下附上php 实现 yield 链接 mysql 几种方法:

方法一

<?php $link = mysqli_connect('localhost','root','','advertising'); if( $result1 = mysqli_query($link, 'SELECT * FROM `test`',MYSQLI_USE_RESULT) ) { $result = $result1; // unset($result1); // mysqli_close($link); //如果这里切断 mysql 链接 将无法获取 数据,原因是加了MYSQLI_USE_RESULT while ( $res = mysqli_fetch_assoc($result1) ){ echo $res['a'] . PHP_EOL; $i++; if( $i ==1000 ){ exit; } } } ?>

方法二

<?php $pdo = new \PDO('mysql:host=localhost;dbname=advertising','root',''); $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); $res = $pdo->query("SELECT * FROM `test`"); //unset($pdo); $i = 0; if ($res) { while ($row = $res->fetch(PDO::FETCH_ASSOC)) { echo $row['a'] . PHP_EOL; $i++; if( $i ==1000 ){ exit; } } } ?>

方法三

<?php $mysqli = new mysqli("localhost", "root", "", "advertising"); $uresult = $mysqli->query("SELECT * FROM `test`", MYSQLI_USE_RESULT); //$uresult->close(); if ($uresult) { while ($row = $uresult->fetch()) { echo $row['a'] . PHP_EOL; $i++; if( $i ==1000 ){ exit; } } }

到此这篇关于PHP实现导入大量CSV数据的示例代码的文章就介绍到这了,更多相关PHP导入CSV数据内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    php脚本电脑关机|电脑关机的脚本

    php脚本电脑关机|电脑关机的脚本,,1. 电脑关机的脚本推荐 AutoIt 自动化脚本 其他 按键精灵、……、AutoHotKey、vbs …… 2. 电脑关机

    PHP什么意思

    PHP什么意思,语言,是一种,PHP什么意思PHP,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写。PHP 是一种 HTM

    创业做网站选择用node好还是php

    创业做网站选择用node好还是php,语言,页面,如果你所开发的是一个PHP网站的前端页面或模板,PHP和Python语言都相对比较简单,所以虽然PHP语

    如何进行phpmyadmin配置 phpmyadmin快速配置方法【详细介绍】

    如何进行phpmyadmin配置 phpmyadmin快速配置方法【详细介绍】,配置,文件,密码,快速,安装配置,方法,    phpmyadmin 配置怎么配置?今天提一下

    php是什么文件格式 php文件打开方法

    php是什么文件格式 php文件打开方法,文件,语言,点击,打开方式,选择,执行,  php文件是一种不能轻易打开的文件,许多人都遇到过点击了php文件后

    PHP文件怎么打开

    PHP文件怎么打开,文件,下载,脚本,怎么打开,语言,选择,PHP文件怎么打开PHP文件一般用Notepad Plus软件打开。PHP文件怎么打开?其实大家并非是需

    php是什么意思

    php是什么意思,执行,语法,语言,特性,文档,脚本语言,php是什么意思很多行外人看到php这三个英文会毫无头绪,完全不知道php是什么意思,本文为大家详

    php 删除数组重复的值

    php 删除数组重复的值,数组,函数,本文目录php 删除数组重复的值如何正确实现PHP删除数组重复元素PHP二维数组如何实现去除重复项php数组怎

    php是前台还是后端语言

    php是前台还是后端语言,语言,支持,语法,性能,版本,提升,php是后端语言,后端是管理、运营、数据挖掘等非面向访问者的东西;php就是在服务器端执行

    PHP中的Yii框架指南

    PHP中的Yii框架指南,框架,安装,配置,应用程序,支持,验证,PHP语言是一门广泛应用的开源脚本语言,它凭借其灵活、高效、安全和易用的特性,成为了网

    聊聊php滑动验证码的实现原理

    聊聊php滑动验证码的实现原理,验证码,滑块,验证,实现原理,图形,拖动,随着互联网的迅速发展,验证码成为了互联网安全保障的重要手段。其中,滑动验

    php的注释有几种

    php的注释有几种,注释,单行注释,作用,多行注释,执行,这是,php的注释有三种,分别是:1、单行注释【//】;2、单行注释【#】;3、多行注释【/** */】。ph

    bcadd php是函数还是扩展

    bcadd php是函数还是扩展,函数,精度,数字,设置,字符串,操作数,bcadd是php中的一个函数,作用是计算两个任意精度数字的加法,该函数的使用语法如“b