如何使用PHP正则提取并计算file.txt指定列的数值?
PHP正则提取文件指定列数值并计算输出
嘿,我来帮你搞定这个需求!下面我会一步步带你实现从已读取的file.txt内容中用正则提取指定列数值,完成计算后输出结果的流程,还会针对常见的文件格式给出示例代码。
假设你的file.txt格式示例
先举个常见的空白分隔列的例子(如果是CSV或其他格式,后面会说调整方法):
15 25 35
45 55 65
75 85 95
第一步:读取文件内容
你已经完成这一步了,但还是贴个标准写法方便参考:
// 一次性读取整个文件内容 $fileContent = file_get_contents('file.txt'); // 如果你是按行读取的,也可以用这个(得到每行的数组) // $lines = file('file.txt', FILE_IGNORE_NEW_LINES);
第二步:用正则提取指定列数值
这里以提取第二列为例,根据文件分隔符调整正则:
情况1:空白字符(空格/制表符)分隔列
用多行模式正则匹配每行的第二列:
// 正则匹配每行第二列的数值(支持整数) preg_match_all('/^\s*\S+\s+(\d+)\s*.*/m', $fileContent, $matches); // $matches[1]就是提取到的第二列所有数值的字符串数组 $columnValues = $matches[1];
正则解释:
m修饰符:开启多行模式,让^和$匹配每行的开头和结尾^\s*:跳过每行开头的空白字符\S+:匹配第一列的内容(非空白字符)\s+:匹配列之间的空白分隔符(\d+):捕获第二列的整数数值(这是我们要的内容)\s*.*:匹配第二列之后的剩余内容
情况2:逗号分隔的CSV格式
如果是CSV文件,正则改成这样:
preg_match_all('/^[^,]*,([^,]*),?.*$/m', $fileContent, $matches); $columnValues = $matches[1];
情况3:支持小数数值
如果列里有小数,把正则中的\d+改成\d+\.?\d*即可:
preg_match_all('/^\s*\S+\s+(\d+\.?\d*)\s*.*/m', $fileContent, $matches);
第三步:数值转换与计算
提取到的是字符串数组,先转成数值类型,再做求和、平均值等计算:
// 转换为整数数组(如果是小数就用floatval) $numericValues = array_map('intval', $columnValues); // 计算总和 $totalSum = array_sum($numericValues); // 计算平均值(避免除以0) $average = count($numericValues) > 0 ? $totalSum / count($numericValues) : 0; // 输出结果 echo "指定列数值总和:{$totalSum}\n"; echo "指定列数值平均值:{$average}\n";
自定义调整提示
- 如果要提取其他列(比如第三列),只需要调整正则中捕获组的位置:比如第三列的正则可以写成
/^\s*\S+\s+\S+\s+(\d+)\s*.*/m - 如果文件有特殊分隔符(比如竖线
|),把正则中的\s+换成\|即可(注意转义)
内容的提问来源于stack exchange,提问作者Phil Tilor
相关产品推荐
相关产品推荐

