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

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里的空行导致报错。

怎么运行

  1. 把你的x.csv、y.csv和这个PHP脚本放在同一个文件夹里
  2. 确保PHP环境能访问这些文件(权限没问题)
  3. 命令行运行:php your_script_name.php,或者在浏览器里访问这个脚本(如果是Web环境)
  4. 之后你会得到z.csv(过滤后的号码)和match_records.csv(匹配的记录)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:18:45