繁体   English   中英

PHP读取了大型CSV文件的一部分

[英]PHP read part of large CSV file

我有一个很大的CSV文件。 由于存在内存问题(对于MySQL),如果可能的话,我想一次只读取其中的一部分。

CSV可能并不重要。 重要的是它需要用新的一行来剪切。

示例内容:

Some CSV content
that will break
on a line break

这可能是我的路径:

$path = 'path/to/my.csv';

在我看来,解决方案可能是这样的:

$csv_content1 = read_csv_file($path, 0, 100);
$csv_content2 = read_csv_file($path, 101, 200);
  1. 它读取第0-100行的原始内容。
  2. 它读取101-200行上的原始内容。

信息

  • 无需解析(只需拆分为内容)。
  • 该文件存在于我自己的服务器上。
  • 不要将整个文件读入内存。
  • 我希望能够再次进行第二次阅读,而不是在同一时间进行。 如果需要,我接受保存温度值,例如指针。

我一直在尝试阅读其他主题,但没有找到与该问题完全匹配的内容。

也许其中一些可以以某种方式起作用?

  • SplFileObject
  • fgetcsv

也许我不能用$csv_content2我用之前$csv_content1 ,因为我需要保存某种形式的指针? 在那种情况下就可以了。 无论如何,我都会按顺序阅读它们。

经过多番思考和阅读,我终于认为我找到了解决问题的方法。 如果这是由于内存使用或其他角度而导致的不好的解决方案,请纠正我。

首轮

$buffer = part($path_to_file, 0, 100);

下一轮

$buffer = part($path_to_file, $buffer['pointer'], 100);

功能

function part($path, $offset, $rows) {
    $buffer = array();
    $buffer['content'] = '';
    $buffer['pointer'] = array();
    $handle = fopen($path, "r");
    fseek($handle, $offset);
    if( $handle ) {
        for( $i = 0; $i < $rows; $i++ ) {
            $buffer['content'] .= fgets($handle);
            $buffer['pointer'] = mb_strlen($buffer['content']);
        }
    }
    fclose($handle);
    return($buffer);
}

在我更面向对象的环境中,它看起来更像这样:

function part() {
    $handle = fopen($this->path, "r");
    fseek($handle, $this->pointer);
    if( $handle ) {
        for( $i = 0; $i < 2; $i++ ) {
            if( $this->pointer != $this->filesize ) {
                $this->content .= fgets($handle);
            }
        }
        $this->pointer += mb_strlen($this->content);
    }
    fclose($handle);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM