如何用PHP将文件中的条目列表拆分为指定大小的批次?
解决PHP按指定批次拆分文件条目并分批次写入的问题
哈哈,这种看似基础但实操起来容易卡壳的需求我太懂了!之前我也翻了不少PHP函数文档,才找到两种简洁好用的实现方式,分场景给你说说:
场景1:文件不大,一次性读取处理
如果你的文件条目数不算特别多(比如几千条),可以直接把所有内容读到数组里,用array_chunk()函数一键拆分批次,代码非常清爽:
// 读取所有行,自动跳过空行并去除换行符 $allItems = file('items.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // 按每100条为一批拆分数组 $batches = array_chunk($allItems, 100); // 遍历每一批完成写入操作 foreach ($batches as $index => $batch) { $batchFileName = "batch_" . ($index + 1) . ".txt"; // 把批次内的条目用换行符拼接后写入文件 file_put_contents($batchFileName, implode(PHP_EOL, $batch) . PHP_EOL); echo "已生成批次文件:{$batchFileName},包含" . count($batch) . "条条目\n"; }
场景2:大文件,逐行读取避免内存溢出
如果你的文件有几万甚至几十万条,一次性加载到内存会占用大量资源,甚至触发内存限制。这种情况下推荐逐行读取,累积到指定数量就处理一批:
$batchSize = 100; // 每批次的条目数 $currentBatch = []; $batchNumber = 0; // 打开文件句柄 $fileHandle = fopen('items.txt', 'r'); if (!$fileHandle) { die("无法打开文件items.txt,请检查文件路径和权限!"); } // 逐行读取处理 while (($line = fgets($fileHandle)) !== false) { $cleanLine = trim($line); // 跳过空行 if (empty($cleanLine)) continue; $currentBatch[] = $cleanLine; // 当当前批次达到指定大小,执行写入 if (count($currentBatch) === $batchSize) { $batchNumber++; $outputFileName = "batch_{$batchNumber}.txt"; file_put_contents($outputFileName, implode(PHP_EOL, $currentBatch) . PHP_EOL); echo "批次{$batchNumber}已写入完成\n"; // 清空当前批次,准备下一批 $currentBatch = []; } } // 处理最后一批不足指定大小的剩余条目 if (!empty($currentBatch)) { $batchNumber++; $outputFileName = "batch_{$batchNumber}.txt"; file_put_contents($outputFileName, implode(PHP_EOL, $currentBatch) . PHP_EOL); echo "最后一批(剩余" . count($currentBatch) . "条)已写入完成\n"; } // 关闭文件句柄 fclose($fileHandle);
小提示
FILE_IGNORE_NEW_LINES和FILE_SKIP_EMPTY_LINES是file()函数的实用参数,能帮你自动处理换行符和空行,省去额外的字符串处理。- 大文件场景一定要用逐行读取的方式,避免内存溢出问题,PHP默认的内存限制一般是128M,几万条文本很容易就占满了。
内容的提问来源于stack exchange,提问作者nibb11
相关产品推荐
相关产品推荐

