Мне нужно получить количество значений (сгруппированных) в столбце CSV - PullRequest
1 голос
/ 06 января 2011

Мне нужно получить количество значений первого столбца. Эти идентификаторы могут или не могут существовать в любом данном файле .csv, который я получаю. Поэтому мне нужно перебрать файл .csv, просматривая первый столбец и либо добавляя его в массив хранения ($ PWSs), если он не существует, либо увеличивая счетчик в этом массиве хранения, если я его уже добавил. 1001 *

У меня есть первый цикл с использованием 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
        }
    }
}

Вот фактические данные. В первом столбце есть идентификаторы для общественных систем водоснабжения. Мне нужно их посчитать.

"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"

Ответы [ 3 ]

2 голосов
/ 06 января 2011
$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...
);
1 голос
/ 06 января 2011
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 atm), поэтому, надеюсь, он все еще работает (если он работал в первую очередь): P

0 голосов
/ 06 января 2011

Вам нужен только один , в то время как цикл.Ваш внешний цикл while остановится, когда он достигнет eof, потому что fgetcsv () вернет FALSE.

Затем просто проверьте столбец на NULL или "" пустую строку.Если столбец не существует в данном массиве, вы должны использовать isset () , чтобы убедиться, что он существует первым в вашем условии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...