Обработка csv данных

Jovanni

Новичок
как обработать файл csv имеющий вид
PHP:
21233,odnoklassniki.ru,Russia
1233,mail.ru,Russia
1123333,odnoklassniki.ru,Russia
123,rambler.ru,Russia
12333,rambler.ru Russia
и т д
Как сделать так что если совпадают 2 ые и 3 ие столбцы совпадают то суммировать 1 ый столбик.
и сортировать по убыванию.

вот код
PHP:
$arrayd=dateRange( $fromd, $tod );
foreach ($arrayd as &$tod) {
$fp = fopen ( 'www', 'w' );
	foreach (glob("$filename/$tod*.bz2") as $bzfile) {
		$fh = bzopen ( "$bzfile", "r" );
		for($i=0; $info = fgetcsv ($fh, 124217728, ","); $i++) {
			list($octets,$source,$dest) = $info;
			$n = count($line);
		if ($dest == $ip) {
			fputcsv($fp,array($octets,$source,$dest));
		} else {
			$do='2';
		}
	}
        bzclose ( $fh );
    }
    fclose( $fp );
}
Помогите решить задачу плз.....
Спасибо заранее!!!!
 

ХакИрФсимагущий

[засикречино]
Предлагаю такой выход...
Объявляем переменную.

Регулярным выражением ишем совпадения. preg_replace_callback()

В колбак функции обьявляем глобальную переменную которую создали вначале.
Из нее делаем масиив, который мы читаем и записываем поступающие данные preg_replace_callback.

А после всего данные будут в той самой перменной которую мы объявили вначале.
 

hell0w0rd

Продвинутый новичок
1) Совпадения ищутся функцией preg_match_all
2) в php есть ссылки
3) в колбэках есть use() конструкции
 

ХакИрФсимагущий

[засикречино]
PHP:
<?php
$csv='21233,odnoklassniki.ru,Russia
1233,mail.ru,Russia
1123333,odnoklassniki.ru,Russia
123,rambler.ru,Russia
12333,rambler.ru Russia';
       preg_replace_callback('/(?!^|\n)([^,]+),([^,]+),([^,]+)(?=$|\n)/is', "C", $csv);       
       function C($a){
           global $g;
           $g[$a['2']][$a['3']]=$g[$a['2']][$a['3']]+$a['1'];
       }
  print_r($g);
?>
И раз уж у меня появился такой куртой инструмент:
PHP:
Finding entry points
Branch analysis from position: 0
Return found
filename:       /home/kir/NetBeansProjects/cms/tc.php
function name:  (null)
number of ops:  9
compiled vars:  !0 = $csv, !1 = $g
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   6     0  >   ASSIGN                                                   !0, '21233%2Codnoklassniki.ru%2CRussia%0A1233%2Cmail.ru%2CRussia%0A1123333%2Codnoklassniki.ru%2CRussia%0A123%2Crambler.ru%2CRussia%0A12333%2Crambler.ru+Russia'
   7     1      SEND_VAL                                                 '%2F%28%3F%21%5E%7C%5Cn%29%28%5B%5E%2C%5D%2B%29%2C%28%5B%5E%2C%5D%2B%29%2C%28%5B%5E%2C%5D%2B%29%28%3F%3D%24%7C%5Cn%29%2Fis'
         2      SEND_VAL                                                 'C'
         3      SEND_VAR                                                 !0
         4      DO_FCALL                                      3          'preg_replace_callback'
   8     5      NOP                                                      
  12     6      SEND_VAR                                                 !1
         7      DO_FCALL                                      1          'print_r'
  14     8    > RETURN                                                   1

branch: #  0; line:     6-   14; sop:     0; eop:     8
path #1: 0, 
Function c:
Finding entry points
Branch analysis from position: 0
Return found
filename:       /home/kir/NetBeansProjects/cms/tc.php
function name:  C
number of ops:  15
compiled vars:  !0 = $a, !1 = $g
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   8     0  >   RECV                                             !0      
   9     1      FETCH_W                      global lock         $0      'g'
         2      ASSIGN_REF                                               !1, $0
  10     3      FETCH_DIM_R                                      $1      !0, 2
         4      FETCH_DIM_R                                      $3      !0, 3
         5      FETCH_DIM_R                                      $5      !0, 2
         6      FETCH_DIM_R                                      $7      !0, 3
         7      FETCH_DIM_R                                      $6      !1, $5
         8      FETCH_DIM_R                                      $8      $6, $7
         9      FETCH_DIM_R                                      $9      !0, 1
        10      ADD                                              ~10     $8, $9
        11      FETCH_DIM_W                                      $2      !1, $1
        12      ZEND_ASSIGN_DIM                                          $2, $3
        13      ZEND_OP_DATA                                             ~10, $11
  11    14    > RETURN                                                   null

branch: #  0; line:     8-   11; sop:     0; eop:    14
path #1: 0, 
End of function c.

PHP Notice:  Undefined index: mail.ru in /home/kir/NetBeansProjects/cms/tc.php on line 10
PHP Notice:  Undefined index: rambler.ru in /home/kir/NetBeansProjects/cms/tc.php on line 10
Array
(
    [odnoklassniki.ru] => Array
        (
            [Russia] => 1124566
        )

    [mail.ru] => Array
        (
            [Russia] => 1233
        )

    [rambler.ru] => Array
        (
            [Russia] => 123
        )

)
И попробуем ваш супер компактный вариант:
PHP:
<?php
$csv='21233,odnoklassniki.ru,Russia
1233,mail.ru,Russia
1123333,odnoklassniki.ru,Russia
123,rambler.ru,Russia
12333,rambler.ru Russia';
       preg_replace_callback('/(?!^|\n)([^,]+),([^,]+),([^,]+)(?=$|\n)/is', function ($a) use (&$g){$g[$a['2']][$a['3']]=$g[$a['2']][$a['3']]+$a['1'];}, $csv);       
  print_r($g);
?>
PHP:
Finding entry points
Branch analysis from position: 0
Return found
filename:       /home/kir/NetBeansProjects/cms/tc.php
function name:  (null)
number of ops:  9
compiled vars:  !0 = $csv, !1 = $g
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   6     0  >   ASSIGN                                                   !0, '21233%2Codnoklassniki.ru%2CRussia%0A1233%2Cmail.ru%2CRussia%0A1123333%2Codnoklassniki.ru%2CRussia%0A123%2Crambler.ru%2CRussia%0A12333%2Crambler.ru+Russia'
   7     1      SEND_VAL                                                 '%2F%28%3F%21%5E%7C%5Cn%29%28%5B%5E%2C%5D%2B%29%2C%28%5B%5E%2C%5D%2B%29%2C%28%5B%5E%2C%5D%2B%29%28%3F%3D%24%7C%5Cn%29%2Fis'
         2      ZEND_DECLARE_LAMBDA_FUNCTION                             '%00%7Bclosure%7D%2Fhome%2Fkir%2FNetBeansProjects%2Fcms%2Ftc.php0x7f660ead80e3'
         3      SEND_VAL                                                 ~1
         4      SEND_VAR                                                 !0
         5      DO_FCALL                                      3          'preg_replace_callback'
   8     6      SEND_VAR                                                 !1
         7      DO_FCALL                                      1          'print_r'
  10     8    > RETURN                                                   1

branch: #  0; line:     6-   10; sop:     0; eop:     8
path #1: 0, 
Function %00%7Bclosure%7D%2Fhome%2Fkir%2FNetBeansProjects%2Fcms%2Ftc.php0x7f660ead80e:
Finding entry points
Branch analysis from position: 0
Return found
filename:       /home/kir/NetBeansProjects/cms/tc.php
function name:  {closure}
number of ops:  15
compiled vars:  !0 = $a, !1 = $g
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   7     0  >   RECV                                             !0      
         1      FETCH_W                      static              $0      'g'
         2      ASSIGN_REF                                               !1, $0
         3      FETCH_DIM_R                                      $1      !0, 2
         4      FETCH_DIM_R                                      $3      !0, 3
         5      FETCH_DIM_R                                      $5      !0, 2
         6      FETCH_DIM_R                                      $7      !0, 3
         7      FETCH_DIM_R                                      $6      !1, $5
         8      FETCH_DIM_R                                      $8      $6, $7
         9      FETCH_DIM_R                                      $9      !0, 1
        10      ADD                                              ~10     $8, $9
        11      FETCH_DIM_W                                      $2      !1, $1
        12      ZEND_ASSIGN_DIM                                          $2, $3
        13      ZEND_OP_DATA                                             ~10, $11
        14    > RETURN                                                   null

branch: #  0; line:     7-    7; sop:     0; eop:    14
path #1: 0, 
End of function %00%7Bclosure%7D%2Fhome%2Fkir%2FNetBeansProjects%2Fcms%2Ftc.php0x7f660ead80e.

PHP Notice:  Undefined index: mail.ru in /home/kir/NetBeansProjects/cms/tc.php on line 7
PHP Notice:  Undefined index: rambler.ru in /home/kir/NetBeansProjects/cms/tc.php on line 7
Array
(
    [odnoklassniki.ru] => Array
        (
            [Russia] => 1124566
        )

    [mail.ru] => Array
        (
            [Russia] => 1233
        )

    [rambler.ru] => Array
        (
            [Russia] => 123
        )

)
Как видите отличий в опкодах нет.
 

ХакИрФсимагущий

[засикречино]
Как видите отличия в оп одах не столь большие. У нас разные оп коды для обьявления функцций. Ваша функция сгенирирывала опкод прямо в оперативку(впрочем пишится ли она потом в кеш я незнаю), а не в кеш. И переменная $g обьявленна как статическая,
PS
если юзать preg_match_all думаю врятли прлучиться быстрее.
 

Jovanni

Новичок
Спасибо .Но что то не получается...

и в apache2 error.log ошибок нет и вывода нет
 

Jovanni

Новичок
[Fri Jun 07 09:18:24 2013] [error] [client 10.0.88.8] PHP Warning: fputcsv() expects parameter 2 to be array, null given in /var/www/calc.php on line 61, referer: http://10.0.88.22/mini.php

PHP:
$arrayd=dateRange( $fromd, $tod );
foreach ($arrayd as &$tod) {
$fp = fopen ( 'www', 'w' );
	foreach (glob("$filename/$tod*.bz2") as $bzfile) {
		$fh = bzopen ( "$bzfile", "r" );
		for($i=0; $info = fgetcsv ($fh, 124217728, ","); $i++) {
			list($octets,$source,$dest) = $info;
			$n = count($info);
		if ($dest == $ip) {
			$geoip2host = geoip_org_by_name($source);
			$country = geoip_country_name_by_name($source);
			$params = array($octets,$geoip2host,$country);
			preg_replace_callback('/(?!^|\n)([^,]+),([^,]+),([^,]+)(?=$|\n)/is', function ($a) use (&$g){$g[$a['2']][$a['3']]=$g[$a['2']][$a['3']]+$a['1'];}, $params);
			fputcsv($fp,$g);                                                       // 61 line
		} else {
			$do='2';
		}
	}
        bzclose ( $fh );
    }
    fclose( $fp );
}

Я новичок сорри...
 

ХакИрФсимагущий

[засикречино]
вы запихиваете данные не такого формата, которого я запихивал.Вам нужно превратить csv фаил в большую строку. И запехнув ее в пример получится аналогичный ответ.
 
Сверху