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

PHP实现CSV逐行读取与行更新:现有代码新增行而非更新如何修复

修复CSV文件行更新变新增的问题

你的代码之所以会新增行而非更新,核心原因是用了fopen($name, 'a')的追加模式——每次调用savetoCSV都会在文件末尾加新行,根本没碰原有内容。要实现行更新,正确的做法是先把所有行读进内存处理,再一次性写回原文件。

修复后的完整代码

// 处理并保存CSV的函数,替换原savetoCSV
function processAndSaveCSV($filename, $processedRows) {
    $fp = fopen($filename, 'w'); // 用写入模式,清空原文件后写入新内容
    // 写入BOM(解决Excel打开乱码问题,不需要可以注释)
    fputs($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
    foreach ($processedRows as $row) {
        fputcsv($fp, $row);
    }
    fclose($fp);
    echo "CSV文件信息已成功更新\n";
}

// 主逻辑
$file = fopen('de_login.csv', 'r');
$processedRows = [];

while (($line = fgetcsv($file)) !== FALSE) {
    // 跳过account_id为空的行,同时保留该行到结果(不想保留就删这行)
    if (empty($line[1])) {
        $processedRows[] = $line;
        continue;
    }

    $client_name = str_replace(" ", "", $line[0]);
    $account_id = str_replace(" ", "", $line[1]);
    $username = str_replace(" ", "", $line[2]);
    $pass = str_replace(" ", "", $line[3]);

    if (strpos($username, 'Login') !== false) {
        // 含Login的行不修改,直接保留原内容
        $processedRows[] = $line;
    } else {
        // 修改该行,添加两个新字段
        $processedRows[] = [$client_name, $account_id, $username, $pass, '', $pass];
    }
}
fclose($file);

// 把所有处理后的行一次性写入原文件,完成更新
processAndSaveCSV('de_login.csv', $processedRows);

关键改动说明

  • 放弃边读边追加的逻辑,改为先收集所有处理后的行,再统一写入
  • 使用'w'模式打开文件:会清空原文件内容,再写入新数据,真正实现"更新"
  • 保留了原逻辑的所有判断规则,同时确保未修改的行也被完整保留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:36:08