0

我是 PHP 新手,并尝试使用 fscanf 读取 CSV 文件以确定最小值和最大值。我之前的问题概述了我实际尝试做的事情。我正在尝试使用 fscanf 来查找 CSV 列的最大值和最小值,如下所示。

$file = fopen('<filename>', 'r');

$a = 0;
$b = 0;
$first = true;
while (fscanf($file, '%d%d', $a, $b)) {
    if ($first)
    {
        $min = $b;
        $max = $b;
        $total = $b;
        $count = 1;
        $first = false;
    }
    else
    {
        $total += $b;
        if ($b < $min) $min = $b;
        if ($b > $max) $max = $b;
        $count++;
    }
}
$avg = $total / $count;

对于我的场景,我会动态获取一个 CSV 文件。我想根据列数使用上面的代码。例如,如果我有 4 列,我需要使用前面的代码,

while (fscanf($file, '%d%d%d%d', $a, $b, $c, $d)) {

并确定 CSV 文件中所有 4 列的最大值和最小值。如果只有 3 列,我需要将代码用作,

while (fscanf($file, '%d%d%d', $a, $b, $c)) {

并确定 CSV 文件中所有 3 列的最大值和最小值。有没有办法在 PHP 中做到这一点?有人请指导我正确的方向。

4

1 回答 1

0

如果您只将两个参数传递给fscanf,它会将解析后的值作为数组返回,因此您应该能够执行以下操作:

$colCount = getColumnCount ($file);  //left as an exercise
$pattern = str_repeat ('%d', $colCount);
while ($values = fscanf ($file, $pattern)) {
  ...
}

我已经$pattern按照您的描述制定了,但您可能需要将其与 CSV 文件的格式相匹配。例如,如果您的文件使用逗号分隔符,则您的模式可能需要改为看起来像str_repeat("%d,", $colCount)

于 2013-10-01T23:06:02.803 回答