文章详细介绍了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大文件导入数据库的示例相关推荐

  1. Java文件读写和CSV文件解析(读取csv文件的一列或若干列)

    文件类 Java 读文件流的知识不可少,先复习一下吧! OREACLE JDK8 DOCS 文件类是Java IO的一个对象,用于指定文件的相关信息,位置和名称信息.如txt文件,csv文件对Java ...

  2. matlab 和python读取csv文件速度_matlab读取csv文件数据并绘图

    circle.m(画二维圆的函数) %该函数是画二维圆圈,输入圆心坐标和半径 %rectangle()函数参数'linewidth'修饰曲线的宽度 %'edgecolor','r',edgecolor ...

  3. html js 读取资源文件,使用HTML5和JQuery读取CSV(Text)文件的实例

    本文介绍使用HTML5和JQuery读取CSV(Text)文件的简单实例. CSV文件内容如图: CSV文件 Text文件内容如图(逗号分隔的文本文件): Text文件 使用HTML5和JQuery读 ...

  4. php读取csv指定行_PHP快速读取CSV大文件指定行

    1.如何快速获取CSV大文件的总行数? 办法一:直接获取文件内容,使用换行符进行拆分得出总行数,这种办法对小文件可行,处理大文件时不可行: 办法二:使用fgets一行一行遍历,得出总行数,这种办法比办 ...

  5. pandas之数据文件导入和导出(python读取.csv,.txt,excel文件(.xlsx)以及导出为.csv、excel文件)

    文件类型:.csv,.txt,.xlsx .csv文件,一行即为数据表的一行.生成数据表字段用逗号隔开(英文的逗号!!!!).csv文件用记事本和excel都能打开,用记事本打开显示逗号,用excel ...

  6. python读取大文件-python快速读取一个大文件内容(瞎猜)

    问题: python有没有一种方法是比简单的readlines()方法更快的方式去读取单个文件,比如,一个从头读文件,一个从尾部读文件,再或者预先将一个文件的行索引分成几个部分来读(文件行内容的操作顺 ...

  7. python读取大文件csv_实现读取csv文件,文件里面是有限个百分数成绩(99.6、76.8等等...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 实现读取csv文件,文件里面是有限个百分数成绩(99.6.76.8等等)导出GPA 和等级 =============================== ...

  8. python远程文件管理系统_python 读取远程服务器文件

    几个提高工作效率的Python内置小工具 在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有 ...

  9. python在读写文件之前需要创建文件对象-python读取或写入文件

    一.创建并读取文本文件 1.该方法需要关闭filereader对象 #!/usr/bin/env python3#读取文件 input_file = "F://python入门//文件//一 ...

最新文章

  1. 直播 | ICML 2021论文解读:对神经网络中层特征复杂度的解释与拆分
  2. Product not scheduled in sales organization XXX,distribution channel
  3. matlab207a,MATLAB教程R2012a课后习题答案
  4. controller接收json数据_这篇SpringBoot整合JSON的学习笔记,建议收藏起来,写的太细了
  5. 如何用sklearn创建机器学习分类器?这里有一份上手指南
  6. 设置SUID用于提权或降权
  7. ofo在MaxCompute的大数据开发之路
  8. PUBG - 罗技鼠标宏 | 兴趣使然的项目,完虐收费宏!点个Star支持一下作者!
  9. C# 判断电脑是否装Arcgis软件
  10. java概述及我的第一个java项目
  11. Linux那些事儿 之 戏说USB(21)向左走,向右走
  12. VRF抽签与投票的思考
  13. oracle事务处理语言,Oracle DTL 数据事务语言
  14. 增强现实中的光学透射式头盔显示器的标定初步
  15. 五子棋游戏-1(绘制棋盘)
  16. 运放微分、积分电路的本质以及电容的阴谋
  17. MIDI音符输入技巧
  18. 系统架构师(一)选择题
  19. windows远程桌面连接redhat
  20. 查找字符串fing()函数

热门文章

  1. 北京超级云计算GPU服务器的使用教程
  2. 亚信产业互联网生态亮相2016南京软博会
  3. Eclipse 设置
  4. 如何安装altium designer 10
  5. Play 1.x框架学习之五:错误信息显示 (error message display In play framework)
  6. SQL Server的一个不显眼的功能 备份文件的分割
  7. 小组级git服务器搭建
  8. 吐血实践 三核就是强过双核
  9. Spark的RDD分区器
  10. RNN的优秀变种: LSTM GRU