PHP读取大文件的指定行数内容

这篇博客探讨了如何在PHP中高效地读取大文件的特定行。通过对比SplFileObject和fopen方法,作者发现使用fopen与fgets组合在内存效率上更优。文中提供了一个自定义函数`getFileLines`,该函数根据PHP版本选择合适的方法读取文件的起始行和结束行,并返回内容。测试显示,这种方法在处理8MB文本时内存占用较低。

需要读取一个文件的几行内容,但是文件比较大,所以研究了下php读取大文件的几行内容的方法,写了一个方法,代码如下(加了注释):

缓存文件如果能够保存在一行, 而利用算法读取指定的行数, 自然会比全部读出来挑选要快得多. 但php似乎这方面比较弱, 不太好操作. 就算使用SplFileObject仍然不是特别可取, 内存压力存在.

复制代码代码如下:

$fp->seek($startLine - 1);

经过测试, 此行代码在8MB文本中游走到最后一行, 内存占用为49KB, 还算不错. 换成fopen方式用fgets跳过的模式, 则花费29KB的内存, fopen还是占优势.

复制代码代码如下:

    function getFileLines($filename, $startLine = 1, $endLine = 50, $method = 'rb')
    {
        $content = array();

        if (version_compare(PHP_VERSION, '5.1.0', '>=')) { // 判断php版本(因为要用到SplFileObject,PHP>=5.1.0) 
            $count = $endLine - $startLine;
            $fp = new \SplFileObject($filename, $method);
            $fp->seek($startLine - 1); // 转到第N行, seek方法参数从0开始计数 
            for ($i = 0; $i <= $count; ++$i) {
                $content[] = $fp->current(); // current()获取当前行内容 
                $fp->next(); // 下一行 
            }
        } else { //PHP<5.1 
            $fp = fopen($filename, $method);
            if (!$fp)
                return 'error:can not read file';
            for ($i = 1; $i < $startLine; ++$i) { // 跳过前$startLine行 
                fgets($fp);
            }

            for ($i; $i <= $endLine; ++$i) {
                $content[] = fgets($fp); // 读取文件行内容 
            }
            fclose($fp);
        }
        return array_filter($content); // array_filter过滤:false,null,'' 
    }

效果不错, SplFileObject类功能比较好.

PHP读取 Excel 文件内容,可以使用 `PHPExcel` 或 `Spreadsheet_Excel_Reader` 等库来实现。其中,`PHPExcel` 是一个功能强大且广泛使用的库,支持多种格式的 Excel 文件写操作。 ### 使用 PHPExcel 读取 Excel 文件 `PHPExcel` 提供了丰富的 API 来操作 Excel 文件,包括读取单元格内容、获取工作表信息等。以下是读取 Excel 文件并输出特定单元格内容的示例代码: ```php require_once './PHPExcel/IOFactory.php'; $file = '1.xlsx'; if (!file_exists($file)) { return "文件不存在"; } $objPHPExcel = PHPExcel_IOFactory::load($file); $objPHPExcel->setActiveSheetIndex(0); $sheet = $objPHPExcel->getActiveSheet(); // 获取 A1 单元格的值 $cellValue = $sheet->getCell('A1')->getValue(); echo 'A1 单元格的内容为:' . $cellValue; ``` 该代码通过 `PHPExcel_IOFactory::load()` 方法加载 Excel 文件,并设置默认工作表后,使用 `getCell()` 方法获取指定单元格的值,适用于读取结构化数据的需求 [^3]。 ### 获取 Excel 文件的基本信息 除了读取单元格内容外,还可以获取 Excel 文件的基本信息,例如工作表数量、行数和列数等: ```php $sheetCount = $objPHPExcel->getSheetCount(); $row = $sheet->getHighestRow(); $col = $sheet->getHighestColumn(); echo '表格数量:' . $sheetCount . '; 行数:' . $row . '; 列数:' . $col; ``` 上述代码展示了如何获取工作表数量、最大行数和列数,便于后续遍历整个表格数据 [^3]。 ### 遍历 Excel 表格数据 如果需要读取整个表格的内容,可以通过循环遍历每一行和每一列: ```php $data = []; for ($i = 1; $i <= $row; $i++) { for ($c = 'A'; $c <= $col; $c++) { $data[] = $sheet->getCell($c . $i)->getValue(); } } echo '<pre>'; print_r($data); ``` 该代码通过嵌套循环遍历每一行和每一列,将所有单元格的值存储在数组中,并使用 `print_r()` 输出结果,适用于需要处理整个 Excel 文件内容的场景 [^3]。 ### 处理编码问题 如果 Excel 文件使用的是非 UTF-8 编码,可能需要设置编码格式以避免乱码问题: ```php $data->setOutputEncoding('GBK'); ``` 此外,在某些情况下,`Spreadsheet_Excel_Reader` 库的 `dump()` 函数会使用 `htmlentities()` 将字符转换为 HTML 实体,此时需要修改源码中的编码设置: ```php htmlentities($val, ENT_COMPAT, "GB2312"); ``` 该设置确保输出的中文字符不会出现乱码,适用于处理不同编码格式的 Excel 文件 [^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值