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
相关产品推荐
相关产品推荐

