【问题标题】:I need to get a count of values (grouped) in a csv column我需要在 csv 列中获取值的计数(分组)
【发布时间】:2011-01-06 01:22:36
【问题描述】:

我需要计算第一列的值。这些 ID 可能存在也可能不存在于我收到的任何给定 .csv 文件中。因此,我需要遍历 .csv 文件,查看第一列,如果它不存在,则将其添加到保存数组 ($PWSs) 中,或者如果我已经添加它,则增加此保存数组中的计数。

我有第一个循环使用 fgetcsv()..这适用于破解文件:

$PWSs = array();

$handle2 = fopen ($uploadfileandpath,"r");
while ($field2array = fgetcsv ($handle2, 130000, ",")) 
{
    // Here is where I would add value or increment $PWSs array
    while (?)
    {
        if ($field2array[0] != ?)
        {
            // Add or increment
        }
    }
}

这是实际数据。第一列有公共供水系统的 ID。我需要数一数。

"00513","08/13/2009","090834311A","R","4","OR1000x6","N","N","E",,1,".73","COLILERT"
"00513","08/13/2009","090834312A","R","39","OR1000x6","N","N","E",,1,".35","COLILERT"
"00154","08/13/2009","090835401A","R","300 Falls Road","OR100016","N","N","E",,1,".10","COLILERT"
"95343","08/13/2009","090835601A","R","Room 1 Sink","OR1000x6","N","N","E",,1,,"COLILERT"
"94585","08/14/2009","090837701A","R","Kitchen","OR1000x6","N","N","E",,1,,"COLILERT"
"94704","08/14/2009","090837801A","R","Outside Tap","OR1000x6","N","N","E",,1,,"COLILERT"
"01430","08/14/2009","090838201A","R","100 Deer Park Ln OT","OR1000x6","N","N","E",,1,,"COLILERT"
"00625","08/14/2009","090839001A","R","Dano and N Rose","OR100016","N","N","E",,1,".35","COLILERT"
"00405","08/17/2009","090840301A","R","Westmont Drive","OR100016","N","N","E",,1,".28","COLILERT"
"01031","08/17/2009","090840401A","R","Unit 2 Faucet","OR100016","N","N","E",,1,,"COLILERT"
"00625","08/17/2009","090840601A","R","Luman Road","OR1000x6","N","N","E",,1,".35","COLILERT"
"00513","08/17/2009","090841001A","R","40","OR1000x6","N","N","E",,1,".18","COLILERT"
"00513","08/17/2009","090841002A","R","10","OR1000x6","N","N","E",,1,".16","COLILERT"

【问题讨论】:

    标签: php arrays csv count grouping


    【解决方案1】:
    $fh = fopen('file.csv', 'rb');
    
    $PWS = array();
    while($row = fgetcsv($fh)) {
        $PWS[$row[0]]++;
    }
    

    基本上,它将使用第一列值作为键填充 PWS,并在它们出现时递增它们。之后,鉴于您上面的示例 csv,您最终会得到

    $PWS = array(
        '00513' => 4
        '00154' => 1
        '95343' => 1
        '94585' => 1
    etc...
    );
    

    【讨论】:

    • 感谢 Marc B。感谢您的这段代码有效,但我也得到了一个未定义的索引:$fh = fopen ($uploadfileandpath,"r"); $PWSs = 数组();而($row = fgetcsv($fh,130000,",")) { $PWSs[$row[0]]++; //此行为每个新值返回一个未定义的索引(它仍然会添加它们) } foreach($PWSs as $key => $value) { print "$key: $value
      "; } fclose($fh);
    • 我上面的评论不太可读。这是得到“未定义索引”错误的一行。 (我无法更改错误报告级别):$PWSs[$row[0]]++;
    • 好吧,我放弃了聪明,我很聪明。我把它放在页面顶部以避免 UNDEFINED INDEX NOTICE: error_reporting(E_ALL ^ E_NOTICE);
    • 您可以在增量之前执行 if (!isset($PWSs[$key[0]]) { $PWSs[$key[0]] = 0}
    • @Marc 请编辑您的答案,因此研究人员无需阅读 cmets 即可获得最佳实践。
    【解决方案2】:
    function get_pws()
    {
        $PWSs = array();
    
        $handle2 = fopen ($uploadfileandpath,"r");
        while ($field2array = fgetcsv ($handle2, 130000, ",")) 
        {
            if(!in_array($field2array[0], $PWSs))
            {
                array_push($PWSs, array('key'=>$field2array[0], 'count'=>1));
            }
            else
            {
                foreach($PWSs as &$PWS)
                {
                    if($PWS['key'] == $field2array[0])
                    {
                        ++$PWS['count'];
                    }
                }
            }
        }
    
        return $PWSs;
    }
    

    我还没有实际运行和测试过这个脚本,所以希望它可以工作,并且它就是你要找的东西;)

    编辑:感谢您指出 dq。同样,我还没有测试过它(不是在安装了 PHP 的机器上),所以希望它仍然有效(如果它首先有效):P

    【讨论】:

    • 澄清一下,这会计算有多少不同的唯一 ID,而不仅仅是包含多少行包含 ID。
    【解决方案3】:

    您只需要一个 while 循环。您的外部 while 循环将在遇到 eof 时停止,因为 fgetcsv() 将返回 FALSE。

    然后只需测试该列是否为 NULL 或 "" 为空字符串。如果给定数组中不存在该列,则应使用 isset() 确保它首先存在于条件中。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多