如何用PHP读取制表符分隔文件并将指定列写入新文本文件
如何用PHP读取制表符分隔文件并将指定列写入新文本文件
嗨,看起来你已经完成了最基础的文件读取部分,很棒!我来帮你调整代码,实现只把邮箱列写入output.txt的需求,顺便修正几个小问题~
首先,你原来的代码里有个关键问题:exit;语句会让循环只执行一次就停止,所以只能处理第一行数据,得把它删掉才行。接下来咱们一步步修改:
方法一:逐行处理(适合大文件,节省内存)
这种方式会逐行读取输入文件,避免一次性加载整个文件到内存,适合较大的文件:
// 打开输入文件,'r'表示只读模式 $inputFp = fopen('input.txt', 'r'); // 打开输出文件,'w'表示写入模式(若文件已存在会清空内容,要追加用'a') $outputFp = fopen('output.txt', 'w'); // 先检查两个文件是否成功打开,避免后续报错 if (!$inputFp || !$outputFp) { die('无法打开文件,请检查文件路径是否正确,以及PHP是否有读写权限!'); } while (!feof($inputFp)) { $line = fgets($inputFp); // 跳过空行,避免处理无效内容 if (trim($line) === '') { continue; } // 用制表符分割每行内容 $data_txt = str_getcsv($line, "\t"); // 确保当前行确实有邮箱列(索引为1),避免格式错误导致的报错 if (isset($data_txt[1])) { // 把邮箱内容写入输出文件,加上换行符保证每行一个邮箱 fwrite($outputFp, $data_txt[1] . "\n"); } } // 操作完成后记得关闭文件句柄,这是良好的编程习惯 fclose($inputFp); fclose($outputFp); echo '搞定!邮箱列已经写入output.txt啦~';
方法二:一次性读取(适合小文件,代码更简洁)
如果你的输入文件不大,可以用更简洁的方式,一次性读取所有内容再处理:
// 读取整个输入文件的内容 $content = file_get_contents('input.txt'); // 按换行符分割成每行 $lines = explode("\n", $content); // 用来存储要写入的邮箱内容 $outputContent = ''; foreach ($lines as $line) { $line = trim($line); // 跳过空行 if ($line === '') { continue; } $data = str_getcsv($line, "\t"); // 确保有邮箱列再添加到输出内容里 if (isset($data[1])) { $outputContent .= $data[1] . "\n"; } } // 把整理好的邮箱内容写入输出文件 file_put_contents('output.txt', $outputContent); echo '操作完成!';
几个需要注意的小细节:
- 文件路径:如果
input.txt不在PHP脚本的同一目录,记得用绝对路径(比如/home/user/input.txt) - 权限问题:要确保PHP有读取
input.txt和写入output.txt的权限,否则会无法操作 - 分隔符确认:确保你的输入文件确实是用制表符
\t分隔的,如果是空格的话,需要调整str_getcsv的第二个参数
备注:内容来源于stack exchange,提问作者Karg
相关产品推荐
相关产品推荐

