You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何高效处理百万行TXT文件:移除指定行并导出至新文件

处理大文件:移除指定行并分离至新文件

太懂你的痛点了!原来的代码用file()把整个文件一次性塞进内存,百万行的文本文件绝对会把内存撑爆——这就是它搞不定大文件的核心原因。

要解决这个问题,我们得换个思路:逐行读取处理,每次只在内存里存一行数据,不管文件多大都能轻松拿捏。下面是实现代码,既能把含.com的行单独存进新文件,又能把剩下的行保留下来:

<?php
$originalFile = "test.txt";
$filteredFile = "filtered_test.txt"; // 存储不含.com的行
$removedComFile = "removed_com_lines.txt"; // 存储被移除的含.com的行

// 打开文件句柄,确保有读写权限
$originalHandle = fopen($originalFile, 'r');
$filteredHandle = fopen($filteredFile, 'w');
$removedHandle = fopen($removedComFile, 'w');

// 检查文件是否成功打开
if (!$originalHandle || !$filteredHandle || !$removedHandle) {
    die("无法打开文件,请检查文件路径和读写权限!");
}

// 逐行读取并处理
while (($line = fgets($originalHandle)) !== false) {
    // 判断当前行是否包含.com
    if (str_contains($line, ".com")) { // PHP 8+可用,低版本替换成strstr()即可
        fwrite($removedHandle, $line);
    } else {
        fwrite($filteredHandle, $line);
    }
}

// 关闭所有文件句柄
fclose($originalHandle);
fclose($filteredHandle);
fclose($removedHandle);

// 可选操作:把过滤后的文件替换原文件(记得先备份原文件!)
// rename($filteredFile, $originalFile);
?>

关键细节说明:

  • 低内存占用:用fgets()每次只读一行,内存消耗几乎可以忽略,完美适配百万级大文件。
  • 精准分离:同时维护两个输出文件,实现“剪切”效果——符合条件的行去新文件,剩下的留作过滤后内容。
  • 版本兼容:如果你的PHP版本低于8.0,把str_contains()换成你原来用的strstr()就行,功能完全一致。
  • 安全提醒:如果要替换原文件,建议先手动备份原文件,或者在代码里加个备份逻辑,避免意外丢数据。

内容的提问来源于stack exchange,提问作者seyedrezabazyar

火山引擎 最新活动