【问题标题】:Compare column from 2 csv if match echo sum如果匹配回声总和,则比较来自 2 csv 的列
【发布时间】:2020-03-25 12:31:41
【问题描述】:

需要帮助我有 2 个 csv 文件

january.csv 3 列:

02Jan2020   Marilyn 31570.29    
02Jan2020   Nancy   30000.00
06Jan2020   John    1570.29 
06Jan2020   Nancy   5000.00
10Jan2020   Marilyn 570.29  
10Jan2020   Nancy   10000.00 
.... etc

suppliers.csv

Marilyn
John
Nancy
..etc

现在我想将与 suppliers.csv 匹配的所有值 (january.csv) 相加

Nancy 30000.00
Nancy 5000.00
Nancy 10000.00
echo sum   45000.00

我在研究后开始这样做,但不确定比较是否正确以及如何对返回值求和

$filename="january.csv";
$base="suppliers.csv"; 
$NOWcodes = array();

$file = fopen($base, 'r'); //registred opened 
while (($line = fgetcsv($file)) !== FALSE) { array_push($NOWcodes, $line[0]);  }
fclose($file);

$file = fopen($filename, 'r'); //all nomes 
while (($line = fgetcsv($file)) !== FALSE) {

if(!in_array($line[0],$NOWcodes)){ } //Not sure how to do it here

echo array_sum($sum)."\n";

fclose($file);

【问题讨论】:

    标签: php csv sum compare


    【解决方案1】:

    CSV 文件中的数据仅由一个分隔符分隔。显示的数据必须采用这种格式才能正确读取。我为 january.csv 使用了一个空格。

    供应商存储在一个数组中。

    $filename = "january.csv";
    $base = "suppliers.csv"; 
    
    $suppliers = [];
    $file = fopen($base, 'r');
    while (($line = fgetcsv($file)) !== FALSE) {
      $suppliers[] = $line[0];
    }
    fclose($file);
    

    然后可以在进一步的 for 循环中执行检查供应商和分组/求和。

    $file = fopen($filename, 'r');
    $sum = [];
    while (($row = fgetcsv($file,0," ")) !== FALSE) {
      $name = $row[1];
      if(in_array($name,$suppliers)){
        if(!array_key_exists($name,$sum)) $sum[$name] = 0.0;
        $sum[$name] += $row[2];
      }
    }
    fclose($file);
    
    //Output Result
    var_export($sum); 
    

    结果:

    array (
      'Marilyn' => 32140.58,
      'Nancy' => 45000.0,
      'John' => 1570.29,
    ) 
    

    array_sum() 可用于所有供应商的总和:

    $total = array_sum($groups);
    

    【讨论】:

    • 我的输出如下,有很多小数位 0 数组('S- Marilyn Salary' => -31570.2900000000008731149137020111083984375, 'S- Nancy Skosana' => -30000.0, 'S- Johan Consulting Fees' '-3000000.0,'s-carol咨询费'=> -30000.0,'s-雪莉薪水'=>'s-shirley薪水'=> -14382.67/14382275000000000007275/1438211445000000000007275/143821144500/14381418342500903320342595761418342590332031259576141834259033203125所有供应商的总数,例如 Juanic+Shirley+Carol+Johan+Marilyn+Nancy= echo Total
    • 您在此处发布的所有内容对我们来说都是不可复制的。小数位数过多是浮点数准确性的问题:stackoverflow.com/questions/21895756/…
    • 我不明白 january.csv 中的数字是一个小数点后 2 位的固定数字,但看起来 sum 函数创建了这个奇怪的 -31570.2900000000008731149137020111083984375 我该如何解决这个问题?
    • 您可以使用 sprintf () / printf () [php.net/manual/de/function.sprintf.php] 将结果格式化到小数点后两位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多