如何使用 PHP 读取大 gz 文件的一部分
How to read portions of a big gz file with PHP
我需要读取一个大的 txt 文件(超过 1GB)以提取其中的多个字符串。使用 gzread,我能够从头读取到一定数量的 kb(比如说 1000000)。但是我怎样才能读取文件的下一个 1000000kb?
有没有办法从一个点开始,从那里读取1000000kb,直到文件没有读完?
$filename = "my_big_file.txt.gz";
$zd = gzopen($filename, "r");
$readfile = gzread($zd,1000000);
$first_array = explode("IT\",$readfile);
unset($first_array[0]);
foreach($first_array as $row){
$full_id = explode(" ",$full_id);
echo $full_id[0];
echo "<br>";
}
gzclose($zd);
更新;在没有 while 循环的情况下获得特定部分
$filename = "my_big_file.txt.gz";
$zd = gzopen($filename, "r");
fseek($zd, 1000000); # jump to a new position here
$readfile = gzread($zd,1000000);
//...process $readfile
gzclose($zd);
例子
一个文本文件(test.txt)
给出的是以下文本文件:
12345678
Gzip 压缩
Gzip 文本文件:
gzip test.txt
创建了一个新文件:test.txt.gz
演示
function getGzFileChunk(string $filename, int $start, int $end)
{
$zd = gzopen($filename, "r");
fseek($zd, $start);
$readfile = gzread($zd, $end);
gzclose($zd);
return $readfile;
}
var_dump(getGzFileChunk("test.txt.gz", 3, 2)); //output: 45
var_dump(getGzFileChunk("test.txt.gz", 1, 2)); //output: 23
var_dump(getGzFileChunk("test.txt.gz", 4, 2)); //output: 56
var_dump(getGzFileChunk("test.txt.gz", 6, 2)); //output: 78
var_dump(getGzFileChunk("test.txt.gz", 2, 2)); //output: 34
旧答案
将 gzread
放在 while 循环中,如下所示:
<?php
$filename = "my_big_file.txt.gz";
$zd = gzopen($filename, "r");
while($readfile = gzread($zd,1000000)) {
//...your process
}
gzclose($zd);
如果您的意思是:您可以在不读取 gzip 文件的前一百万字节的情况下开始读取第二百万字节,那么答案是否定的。您不能随机访问 gzip 文件。
我需要读取一个大的 txt 文件(超过 1GB)以提取其中的多个字符串。使用 gzread,我能够从头读取到一定数量的 kb(比如说 1000000)。但是我怎样才能读取文件的下一个 1000000kb? 有没有办法从一个点开始,从那里读取1000000kb,直到文件没有读完?
$filename = "my_big_file.txt.gz";
$zd = gzopen($filename, "r");
$readfile = gzread($zd,1000000);
$first_array = explode("IT\",$readfile);
unset($first_array[0]);
foreach($first_array as $row){
$full_id = explode(" ",$full_id);
echo $full_id[0];
echo "<br>";
}
gzclose($zd);
更新;在没有 while 循环的情况下获得特定部分
$filename = "my_big_file.txt.gz";
$zd = gzopen($filename, "r");
fseek($zd, 1000000); # jump to a new position here
$readfile = gzread($zd,1000000);
//...process $readfile
gzclose($zd);
例子
一个文本文件(test.txt)
给出的是以下文本文件:
12345678
Gzip 压缩
Gzip 文本文件:
gzip test.txt
创建了一个新文件:test.txt.gz
演示
function getGzFileChunk(string $filename, int $start, int $end)
{
$zd = gzopen($filename, "r");
fseek($zd, $start);
$readfile = gzread($zd, $end);
gzclose($zd);
return $readfile;
}
var_dump(getGzFileChunk("test.txt.gz", 3, 2)); //output: 45
var_dump(getGzFileChunk("test.txt.gz", 1, 2)); //output: 23
var_dump(getGzFileChunk("test.txt.gz", 4, 2)); //output: 56
var_dump(getGzFileChunk("test.txt.gz", 6, 2)); //output: 78
var_dump(getGzFileChunk("test.txt.gz", 2, 2)); //output: 34
旧答案
将 gzread
放在 while 循环中,如下所示:
<?php
$filename = "my_big_file.txt.gz";
$zd = gzopen($filename, "r");
while($readfile = gzread($zd,1000000)) {
//...your process
}
gzclose($zd);
如果您的意思是:您可以在不读取 gzip 文件的前一百万字节的情况下开始读取第二百万字节,那么答案是否定的。您不能随机访问 gzip 文件。