PHP开发需求:两个CSV文件前缀匹配过滤并生成目标文件
实现CSV号码前缀匹配与过滤的PHP方案
嘿,作为PHP新手能想到用CSV处理这类批量数据需求已经很赞了!我来给你一套实用的代码方案,每一步都有注释,你跟着做就能搞定~
核心思路
咱们先理清楚要做的事:
- 把x.csv里的前缀提取出来,按前缀长度从长到短排序(避免短前缀先匹配导致长前缀漏判,比如44和4474,得先查4474)
- 遍历y.csv的每一条号码,检查是否匹配x里的前缀
- 匹配的号码单独记录,不匹配的存入z.csv
- 最后把结果写入文件
完整代码实现
<?php // 定义文件路径(如果文件不在脚本同目录,改成绝对路径,比如 '/var/www/x.csv') $xFile = 'x.csv'; $yFile = 'y.csv'; $zFile = 'z.csv'; $matchLogFile = 'match_records.csv'; // 1. 读取x.csv,提取前缀数组 $prefixes = []; if (($handle = fopen($xFile, 'r')) !== FALSE) { // 跳过表头 fgetcsv($handle); while (($data = fgetcsv($handle)) !== FALSE) { // 确保前缀和国家都存在(避免空行) if (!empty($data[0]) && !empty($data[1])) { $prefix = trim($data[0]); $country = trim($data[1]); $prefixes[] = [ 'prefix' => $prefix, 'country' => $country, 'length' => strlen($prefix) // 记录前缀长度,用于排序 ]; } } fclose($handle); } // 按前缀长度从长到短排序,优先匹配长前缀 usort($prefixes, function($a, $b) { return $b['length'] - $a['length']; }); // 2. 处理y.csv,筛选号码并记录匹配项 $zData = []; $matchRecords = []; // 先把表头加进去 $zData[] = ['country', 'phone number']; $matchRecords[] = ['Country', 'Phone Number', 'Match Prefix']; if (($handle = fopen($yFile, 'r')) !== FALSE) { // 跳过表头 fgetcsv($handle); while (($data = fgetcsv($handle)) !== FALSE) { if (!empty($data[0]) && !empty($data[1])) { $country = trim($data[0]); $phone = trim($data[1]); $matched = false; $matchedPrefix = ''; // 遍历前缀数组,检查是否匹配 foreach ($prefixes as $p) { $prefixLen = $p['length']; // 检查号码长度是否大于等于前缀长度,且开头匹配 if (strlen($phone) >= $prefixLen && substr($phone, 0, $prefixLen) === $p['prefix']) { $matched = true; $matchedPrefix = $p['prefix']; break; // 找到匹配的前缀就停止,避免重复匹配 } } if ($matched) { // 加入匹配记录 $matchRecords[] = [$country, $phone, $matchedPrefix]; } else { // 加入z.csv的内容 $zData[] = [$country, $phone]; } } } fclose($handle); } // 3. 写入z.csv if (($handle = fopen($zFile, 'w')) !== FALSE) { foreach ($zData as $row) { fputcsv($handle, $row); } fclose($handle); echo "z.csv 生成成功!\n"; } // 4. 写入匹配记录 if (($handle = fopen($matchLogFile, 'w')) !== FALSE) { foreach ($matchRecords as $row) { fputcsv($handle, $row); } fclose($handle); echo "匹配记录 match_records.csv 生成成功!\n"; } ?>
关键细节说明
- 前缀排序:必须按长度倒序,比如如果x.csv里有
44和4474,如果先匹配44,那4474xxxx会被误判为匹配44,而不是更精确的4474,倒序就能避免这个问题。 - CSV读写函数:用
fgetcsv和fputcsv是最安全的,它们会自动处理CSV里的逗号、引号等特殊字符,比手动用explode拆分靠谱多了。 - 空行处理:代码里加了
!empty()判断,避免处理CSV里的空行导致报错。
怎么运行
- 把你的x.csv、y.csv和这个PHP脚本放在同一个文件夹里
- 确保PHP环境能访问这些文件(权限没问题)
- 命令行运行:
php your_script_name.php,或者在浏览器里访问这个脚本(如果是Web环境) - 之后你会得到
z.csv(过滤后的号码)和match_records.csv(匹配的记录)
内容的提问来源于stack exchange,提问作者Ervis Hysi
相关产品推荐
相关产品推荐

