PHP 逐行读取大文件并替换字符串
PHP read a large file line by line and string replace
我想逐行读取一个大文件,执行字符串替换并将更改保存到文件中,IOW 一次重写 1 行。 PHP/ Unix 有什么简单的解决方案吗?
我想到的最简单的方法是将这些行写入一个新文件,然后替换旧文件,但这并不优雅。
在大多数情况下,使用临时文件似乎不是一个糟糕的解决方案。
$f='data.txt';
$fh=fopen($f,'r+');
while (($l=fgets($fh))!==false) file_put_contents('tmp',clean($l),FILE_APPEND);
fclose($f);
unlink($f);
rename('tmp',$f);
我认为只有 2 个选项
- 使用内存
读取、替换然后将替换后的字符串存入内存,完成后覆盖源文件。
- 使用 tmp 文件
读取并替换字符串,然后立即将每一行写入 tmp 文件,完成后,用 tmp 文件替换原始文件
#1会更有效,因为IO很昂贵,如果你有大内存或者处理文件不是太大,就用它。
#2 会有点慢,但即使在大文件上也很稳定。
当然,您可以通过将替换字符串 逐行 写入文件(而不仅仅是 逐行 )来组合这两种方式
有我能想到的最简单、最优雅的方法。
我想逐行读取一个大文件,执行字符串替换并将更改保存到文件中,IOW 一次重写 1 行。 PHP/ Unix 有什么简单的解决方案吗? 我想到的最简单的方法是将这些行写入一个新文件,然后替换旧文件,但这并不优雅。
在大多数情况下,使用临时文件似乎不是一个糟糕的解决方案。
$f='data.txt';
$fh=fopen($f,'r+');
while (($l=fgets($fh))!==false) file_put_contents('tmp',clean($l),FILE_APPEND);
fclose($f);
unlink($f);
rename('tmp',$f);
我认为只有 2 个选项
- 使用内存
读取、替换然后将替换后的字符串存入内存,完成后覆盖源文件。
- 使用 tmp 文件
读取并替换字符串,然后立即将每一行写入 tmp 文件,完成后,用 tmp 文件替换原始文件
#1会更有效,因为IO很昂贵,如果你有大内存或者处理文件不是太大,就用它。
#2 会有点慢,但即使在大文件上也很稳定。
当然,您可以通过将替换字符串 逐行 写入文件(而不仅仅是 逐行 )来组合这两种方式
有我能想到的最简单、最优雅的方法。