You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP逐行读取test.txt转对象仅读取第一行问题求助

问题分析与修复方案

先给你拆解下当前代码的核心问题,再给出完整的修复方案:

首先,你的代码里有个致命的变量覆盖错误:在while循环里你把$file这个文件句柄变量直接赋值成了fgets($file)的结果,第一次循环后$file就变成了字符串,不再是文件句柄,后续feof($file)会直接失效,导致循环只执行一次,自然只能读到第一行。

其次,你的test.txt内容是两个JSON对象直接用空格拼接在一起的,这不是合法的单行JSON结构,就算修复了变量问题,json_decode也没法正确解析这种格式。

下面是修复后的完整代码,同时解决这两个问题:

修复后的代码

// 用单独变量存储文件句柄,避免被覆盖
$fileHandle = fopen(__DIR__.'/test.txt','r');
if ($fileHandle) {
    // 逐行读取,用$line接收内容,不碰文件句柄变量
    while (($line = fgets($fileHandle)) !== false) {
        // 先清理行首尾的空白字符
        $line = trim($line);
        if (empty($line)) continue;
        
        // 用正则分割同一行里的多个JSON对象(匹配"}"后接空格再"{")的位置分割,不破坏JSON内部结构
        $jsonSegments = preg_split('/(?<=})\s+(?={)/', $line);
        
        foreach ($jsonSegments as $jsonStr) {
            $obj = json_decode($jsonStr);
            if ($obj !== null) { // 确保JSON解析成功
                echo $obj->sid;
                echo "<hr>";
            } else {
                echo "JSON解析失败:" . json_last_error_msg();
                echo "<hr>";
            }
        }
    }
    // 记得关闭文件句柄,释放服务器资源
    fclose($fileHandle);
} else {
    echo "无法打开目标文件";
}

关键修复细节

  • 避免变量覆盖:用$fileHandle专门存储文件句柄,循环里用$line接收每行内容,保证循环能正常执行到文件末尾。
  • 兼容多JSON格式:用正则表达式精准分割同一行里的多个独立JSON对象,比简单按空格分割更严谨,不会破坏JSON内部的空格结构。
  • 增加错误处理:补充了文件打开失败的判断,以及JSON解析失败的提示,方便排查问题。
  • 优化资源占用:循环结束后关闭文件句柄,避免不必要的资源浪费,也能间接减少加载耗时。

加载耗时优化建议

如果你的test.txt文件体积较大,可以再做这些优化:

  • 给fgets指定缓冲区大小,比如fgets($fileHandle, 4096),减少IO操作次数。
  • 尽量把文件格式改成每行一个独立JSON对象的规范格式,这样可以去掉分割逻辑,直接解析每行,效率会更高。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:30:24