[英]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);
信息
我一直在尝试阅读其他主题,但没有找到与该问题完全匹配的内容。
也许其中一些可以以某种方式起作用?
也许我不能用$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.