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

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行开始读取

$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);

3、综合上面两点,整理成一个csv文件读取的类:

代码如下:

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 < 0) ? 0 : $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;

}

}

4、调用方法如下:

代码如下:

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方法稍加改动为fgets即可。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用WebLogic共享库连续交付ADF应用程序

介绍 当ADF应用程序建立在共享库之上时&#xff0c;有一种非常流行的架构模式。 因此&#xff0c;主应用程序被部署为EAR&#xff0c;并且所有子系统都在共享库中实现&#xff0c;这些共享库可以在“热”模式下独立构建并作为JAR部署到WebLogic&#xff0c;而无需停机。 这种方…

信号与系统 chapter1 常见信号及其变换

什么是信号&#xff1f; 它的定义及其宽泛&#xff0c;但在我们电子通信工程中&#xff0c;我们可以把它看成一种波形&#xff1b;在数学上&#xff0c;我们可以把它看成一个函数。说到函数&#xff0c;函数又分为离散与连续&#xff0c;信号也是一样&#xff0c;分为离散信号…

11选5下期算法_11选5为什么你不中奖

11选五 顾名思义 11个号里选择五个号码球 即中奖 当然玩法也多种多样 这也让很多彩民摸不清头绪 11选5这个东西呢 首先要心态好 毕竟20分钟一起 也算频率大的了 如果盲目的倍投 盲目的跟号 那就容易陷进去 无法自拔 所有的彩票都有概率 都有他所在的规矩 例如127910 8就在79中间…

信号与系统 chapter2 冲激偶函数与阶跃函数

什么是冲激偶函数 简单来说&#xff0c;从负方向向0趋近&#xff0c;结果为无穷大&#xff0c;从正方向趋近于0&#xff0c;结果为无穷小 它的性质&#xff1a; 冲激函数求导得来&#xff0c;推广&#xff1a; 阶跃函数 会考察你让你写出函数表达式 看上面那个式子&#xf…

c语言对中文字符串编码_Python || 学习笔记(1):数据类型字符串变量和编码

数据类型特性&#xff1a;对于0很多的整数&#xff0c;python允许用_对0进行分离10_000_000_000就等同于1000000000016进制用0x开头进行表示对于很大或很小的浮点数必须使用科学计数法表示&#xff0c;表示方法为 2.13e10表示2.13x10^10转义字符与C语言一样&#xff0c;为\&…

信号与系统 chapter3 冲激函数的尺度变换

在chapter2里我们简单的示例了一个阶跃函数做尺度变换的例子&#xff0c;在这一节里我们会对冲激函数做尺度变换&#xff0c;同样很简单 关于δ(at)\delta(at)δ(at) 它的证明如下&#xff0c;使用换元法即可得到&#xff1a; 始终利用的是冲激函数只在t0t0t0处有意义 如果它…

mongodb 主键_MongoDB主键是您的朋友

mongodb 主键MongoDB集合中的所有文档都有一个主键&#xff0c;称为_id 。 该字段在插入后自动分配给文档&#xff0c;因此几乎不需要提供它。 _id字段有趣的是&#xff0c;它是基于时间的 。 也就是说&#xff0c; _id的基础类型为ObjectId &#xff0c;是12字节的BSON类型 &a…

web前端知识点太多_前端知识点总结——框架中报错集锦(含解决方法)

前端知识点总结——框架中报错集锦(含解决方法)1.vue1、指定template直接返回多个标签Component template should contain exactly one root element.解决方案&#xff1a;指定一个容器&#xff0c;将需要返回的多个标签放在这个容器中 div/form/a…2、读取了一个变量的属性但是…

信号与系统 chapter4 单位脉冲与单位阶跃序列

标题里有序列&#xff0c;说明咱们这里的自变量都是离散的&#xff0c;离散序列是相对于前面的连续信号而言&#xff0c;这里给它做了一个比较 单位脉冲序列 可以看到单位脉冲函数依然是十分牛批&#xff0c;只有在t0t0t0的地方才发挥作用 单位阶跃 两个单位阶跃序列做差可以…

原始性能数字– Spring Boot 2 Webflux与Spring Boot 1

我对性能测试的设置如下&#xff1a; 示例应用程序公开了一个端点&#xff08;/ passthrough / message&#xff09;&#xff0c;该端点又调用下游服务。 到端点的请求消息如下所示&#xff1a; {"id": "1","payload": "sample payload&q…

airpods耳机敲击没反应_iOS11.2.6造成AirPods耳机出现奇怪问题 网友:解决方法很简单...

大河报大河客户端记者 华飞众所周知&#xff0c;苹果为了解决iOS11.2.5中特殊字符、图片引起的系统崩溃的问题&#xff0c;突然推送了iOS 11.2.6正式版&#xff0c;而随着更新用户不断增加&#xff0c;目前该版本对于使用AirPods 的iphone用户带来了不少奇怪问题&#xff0c;特…

gradle运行测试代码_Gradle的好处:运行单个测试

gradle运行测试代码我们可以使用Java插件添加的test任务&#xff0c;使用Gradle运行测试代码。 默认情况下&#xff0c;将执行项目中找到的所有测试。 如果要运行一个测试&#xff0c;可以使用Java系统属性test.single和测试名称。 实际上&#xff0c;系统属性的模式是taskName…

信号与系统 chapter5 线性系统与非线性系统

今天我们说一说系统的分类 线性系统 顾名思义&#xff0c;满足线性性质的系统 它有三个特性&#xff1a; 齐次性可加性线性性 这里常见在选择题里让你判断 f1(.)f_{1}(.)f1​(.)代表的是激励&#xff0c;系统的响应不仅和它当前的状态相关&#xff0c;还和以前的状态相关的…

python爬取音乐源码_手把手教你使用Python抓取QQ音乐数据(第一弹)

【一、项目目标】获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名、专辑名、播放链接。由浅入深&#xff0c;层层递进&#xff0c;非常适合刚入门的同学练手。【二、需要的库】主要涉及的库有&#xff1a;requests、json、openpyxl【三、项目实现】1.了解 QQ 音乐网站的 rob…

Java接口–历年来Java 9之旅–默认和私有方法

介绍 Java接口已经比Java版本进行了更多的演变&#xff0c;而Java 8和Java 9则有所发展。在本文中&#xff0c;我们将探讨接口在Java 8之前的样子以及如何在Java 8和Java 9中得到增强。 Java 8之前的接口 接口将具有一个或多个抽象方法&#xff0c;如下所示&#xff1a; publ…

信号与系统 chapter6 时变与时不变系统

时不变系统 通俗来说&#xff0c;就是输入延迟一段时间后&#xff0c;输出也延迟一段相同的时间。比如说一个示波器&#xff0c;你要给它上电显示波形&#xff0c;你就是示波器的输入&#xff0c;你一按下开关&#xff0c;它就马上亮了&#xff1b;下次你在开关上发呆5秒钟再按…

胆战心惊形容什么_胆战心惊的近义词

胆战心惊近义词&#xff1a; 不寒而栗( 注释:栗&#xff1a;畏惧&#xff0c;发抖。不冷而发抖。形容非常恐惧。)胆战心惊( 注释:战&#xff1a;通“颤”&#xff0c;发抖。形容十分害怕。)毛骨悚然( 注释:悚然&#xff1a;害怕的样子。汗毛竖起&#xff0c;脊梁骨发冷。形容十…

信号与系统 chapter7 因果与非因果

“因果”这个词常常在佛教里提到&#xff0c;比如有因才有果&#xff0c;放在信号与系统里就是你有输入才有输出&#xff0c;但是在所有的系统中你有输入就一定有输出吗&#xff1f;又或者是你有输出但没有输入&#xff0c;这样的系统如何称呼&#xff1f; 此类系统称为非因果系…

互联网和大数据是什么意思_何为互联网大数据?为什么每个人在数据的面前,相当于一丝不挂?...

何为互联网大数据&#xff1f;大数据背后核心迷局是什么&#xff1f;那通过下面一段对话&#xff0c;您可能就明白了。——必胜客店的电话铃响了。客服拿起电话&#xff1a;客服&#xff1a;您好! 请问有什么需要我为您服务&#xff1f;顾客&#xff1a;你好&#xff01; 我想要…

ejb 2.1 jboss_JBoss AS7 JNDI和EJB 3.1命名更改

ejb 2.1 jboss由于“功能培训”继续前进&#xff0c;而我们又没有保持软件堆栈的最新状态&#xff0c;因此我们的团队发现自己处于不得不迁移的不利位置&#xff1a; JBoss 4.2.3到AS 7.1.x&#xff08;当前为7.1.1&#xff09; EJB 2.1到EJB 3.1 Hibernate2到Hibernate3或4…