php如何导入大文件数据库,PHP读取CSV大文件导入数据库的示例
文章详细介绍了csv文件在php中快速导入到mysql数据库中的例子,虽然从最简单的几百MB的到最后使用插件实现几个GB数据导入中间有一些嗑碰了,但结果还是好的.
对于数百万条数据量的CSV文件,文件大小可能达到数百M,如果简单读取的话很可能出现超时或者卡死的现象.
为了成功将CSV文件里的数据导入数据库,分批处理是非常必要的,下面这个函数是读取CSV文件中指定的某几行数据,代码如下:<?php
/**
* csv_get_lines 读取CSV文件中的某几行数据
* @param $csvfile csv文件路径
* @param $lines 读取行数
* @param $offset 起始行数
* @return array
*
*/
function csv_get_lines($csvfile, $lines, $offset = 0) {
if (!$fp = fopen($csvfile, 'r')) {
//开源代码phprm.com
return false;
}
$i = $j = 0;
while (false !== ($line = fgets($fp))) {
if ($i++
continue;
}
break;
}
$data = array();
while (($j++
$data[] = fgetcsv($fp);
}
fclose($fp);
return $data;
}
//调用方法:
$data = csv_get_lines('path/bigfile.csv', 10, 2000000);
print_r($data);
?>
函数主要采用行定位的思路,通过跳过起始行数来实现文件指针定位,至于数据如何入库本文不再详细讲述.
上述函数对500M以内的文件进行过测试,运行通畅,对于1GB的文件发现有点慢了,于是再接着找方法.
如何快速完整的操作大文件仍然还存在一些问题.
1、如何快速获取CSV大文件的总行数?
办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行;
办法二:使用fgets一行一行遍历,得出总行数,这种办法比办法一好一些,但大文件仍有超时的可能;
办法三:借助SplFileObject类,直接将指针定位到文件末尾,通过SplFileObject::key方法获取总行数,这种办法可行,且高效。
具体实现方法,代码如下:$csv_file = 'path/bigfile.csv';
$spl_object = new SplFileObject($csv_file, 'rb');
$spl_object->seek(filesize($csv_file));
echo $spl_object->key();
2、如何快速获取CSV大文件的数据?
仍然使用PHP的SplFileObject类,通过seek方法实现快速定位,代码如下:$csv_file = 'path/bigfile.csv';
$start = 100000; // 从第100000行开始 www.phprm.com读取
$num = 100; // 读取100行
$data = array();
$spl_object = new SplFileObject($csv_file, 'rb');
$spl_object->seek($start);
while ($num-- && !$spl_object->eof()) {
$data[] = $spl_object->fgetcsv();
$spl_object->next();
}
print_r($data);
综合上面两点,整理成一个csv文件读取的类,代码如下:<?php
class CsvReader {
private $csv_file;
private $spl_object = null;
private $error;
public function __construct($csv_file = '') {
if ($csv_file && file_exists($csv_file)) {
$this->csv_file = $csv_file;
}
}
public function set_csv_file($csv_file) {
if (!$csv_file || !file_exists($csv_file)) {
$this->error = 'File invalid';
return false;
}
$this->csv_file = $csv_file;
$this->spl_object = null;
}
public function get_csv_file() {
return $this->csv_file;
}
private function _file_valid($file = '') {
$file = $file ? $file : $this->csv_file;
if (!$file || !file_exists($file)) {
return false;
}
if (!is_readable($file)) {
return false;
}
return true;
}
private function _open_file() {
if (!$this->_file_valid()) {
$this->error = 'File invalid';
return false;
}
if ($this->spl_object == null) {
$this->spl_object = new SplFileObject($this->csv_file, 'rb');
}
return true;
}
public function get_data($length = 0, $start = 0) {
if (!$this->_open_file()) {
return false;
}
$length = $length ? $length : $this->get_lines();
$start = $start - 1;
$start = ($start
$data = array();
$this->spl_object->seek($start);
while ($length-- && !$this->spl_object->eof()) {
$data[] = $this->spl_object->fgetcsv();
$this->spl_object->next();
}
return $data;
}
public function get_lines() {
if (!$this->_open_file()) {
return false;
}
$this->spl_object->seek(filesize($this->csv_file));
return $this->spl_object->key();
}
public function get_error() {
return $this->error;
}
}
?>
调用方法如下:include('CsvReader.class.php');
$csv_file = 'path/bigfile.csv';
$csvreader = new CsvReader($csv_file);
$line_number = $csvreader->get_lines();
$data = $csvreader->get_data(10);
echo $line_number, chr(10);
print_r($data);
其实,上述CsvReader类并不只针对CSV大文件,对于其他文本类型的大文件或超大文件同样可用,前提是将类中fgetcsv方法稍加改动为current即可.
随意转载~但请保留教程地址★
php如何导入大文件数据库,PHP读取CSV大文件导入数据库的示例相关推荐
- Java文件读写和CSV文件解析(读取csv文件的一列或若干列)
文件类 Java 读文件流的知识不可少,先复习一下吧! OREACLE JDK8 DOCS 文件类是Java IO的一个对象,用于指定文件的相关信息,位置和名称信息.如txt文件,csv文件对Java ...
- matlab 和python读取csv文件速度_matlab读取csv文件数据并绘图
circle.m(画二维圆的函数) %该函数是画二维圆圈,输入圆心坐标和半径 %rectangle()函数参数'linewidth'修饰曲线的宽度 %'edgecolor','r',edgecolor ...
- html js 读取资源文件,使用HTML5和JQuery读取CSV(Text)文件的实例
本文介绍使用HTML5和JQuery读取CSV(Text)文件的简单实例. CSV文件内容如图: CSV文件 Text文件内容如图(逗号分隔的文本文件): Text文件 使用HTML5和JQuery读 ...
- php读取csv指定行_PHP快速读取CSV大文件指定行
1.如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行: 办法二:使用fgets一行一行遍历,得出总行数,这种办法比办 ...
- pandas之数据文件导入和导出(python读取.csv,.txt,excel文件(.xlsx)以及导出为.csv、excel文件)
文件类型:.csv,.txt,.xlsx .csv文件,一行即为数据表的一行.生成数据表字段用逗号隔开(英文的逗号!!!!).csv文件用记事本和excel都能打开,用记事本打开显示逗号,用excel ...
- python读取大文件-python快速读取一个大文件内容(瞎猜)
问题: python有没有一种方法是比简单的readlines()方法更快的方式去读取单个文件,比如,一个从头读文件,一个从尾部读文件,再或者预先将一个文件的行索引分成几个部分来读(文件行内容的操作顺 ...
- python读取大文件csv_实现读取csv文件,文件里面是有限个百分数成绩(99.6、76.8等等...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 实现读取csv文件,文件里面是有限个百分数成绩(99.6.76.8等等)导出GPA 和等级 =============================== ...
- python远程文件管理系统_python 读取远程服务器文件
几个提高工作效率的Python内置小工具 在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有 ...
- python在读写文件之前需要创建文件对象-python读取或写入文件
一.创建并读取文本文件 1.该方法需要关闭filereader对象 #!/usr/bin/env python3#读取文件 input_file = "F://python入门//文件//一 ...
最新文章
- 直播 | ICML 2021论文解读:对神经网络中层特征复杂度的解释与拆分
- Product not scheduled in sales organization XXX,distribution channel
- matlab207a,MATLAB教程R2012a课后习题答案
- controller接收json数据_这篇SpringBoot整合JSON的学习笔记,建议收藏起来,写的太细了
- 如何用sklearn创建机器学习分类器?这里有一份上手指南
- 设置SUID用于提权或降权
- ofo在MaxCompute的大数据开发之路
- PUBG - 罗技鼠标宏 | 兴趣使然的项目,完虐收费宏!点个Star支持一下作者!
- C# 判断电脑是否装Arcgis软件
- java概述及我的第一个java项目
- Linux那些事儿 之 戏说USB(21)向左走,向右走
- VRF抽签与投票的思考
- oracle事务处理语言,Oracle DTL 数据事务语言
- 增强现实中的光学透射式头盔显示器的标定初步
- 五子棋游戏-1(绘制棋盘)
- 运放微分、积分电路的本质以及电容的阴谋
- MIDI音符输入技巧
- 系统架构师(一)选择题
- windows远程桌面连接redhat
- 查找字符串fing()函数