PHP中怎样导入CSV数据,方法是什么
Admin 2022-08-02 群英技术资讯 882 次浏览
这篇文章给大家分享的是PHP中怎样导入CSV数据,方法是什么。小编觉得挺实用的,因此分享给大家做个参考,文中的介绍得很详细,而要易于理解和学习,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。网上有很多介绍大量上传数据的,感觉都是一个抄一个,这是自己写的处理方式,在一些项目中已经应用.
主要利用 yield 完成文件读取,这个重点看会了,其他基本就很简单.
//获取请求的参数
$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(); // 处理下一行数据
}
/**
* @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;
}
}
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
PHP成为最流行的脚本语言有许多原因:灵活性,易用性等。我们通常需要一个PHP框架来代替程序员完成那些重复的部分。PHP框架是什么?PHP框架提供了一个用以构建web应用的基...
区别:1、“laravel5.1”版本是TLS版本,提供了三年的安全修复支持,“laravel5.0”版本不是长期支持的版本;2、“5.1”版本“app/Handlers”被合并到“app/Listeners”目录,“5.0”版本没有合并。
PHP扩展类型及安装方式解析, 一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
<html><head><title>杨辉三角形</title></head><body><p align="center">输出给定阶数的杨辉三角形</p><form method="post" action="&
今天小编就为大家分享一篇在Laravel 的 Blade 模版中实现定义变量,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008