Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка csv фала 
:(
    Опции темы
scion
Дата 23.6.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



что-то меня совсем клинит...
есть файлы... много...
такого содержания:
index;;/index.php;33.241.45.11;1244436502;0.0375900268555
index;;/index.php;77.241.45.11;1244436457;0.0375270843506
index;;/index.php;77.241.45.11;1244436458;0.0377089977264
index;;/index.php;77.241.45.11;1244436465;0.0376060009003
index;;/index.php;77.241.45.11;1244436472;0.0377838611603
index;;/index.php;77.241.45.11;1244436476;0.0371870994568
xmap;df;/xmap.php?option=getheroes&x=-6&y=7&_=1244436351824;44.155.184.33;1244436205;0.0984649658203
...

нужно вытаскивать имя модуля, и время генерации. 
т.е.
index и 0.0375900268555

в этоге должна получится табличка:
         дата                       дата                       ....
комп. сред.время ген.     сред  время генерации
комп2 ....
...

у меня получается:

Код

!/usr/bin/perl
use POSIX qw (strftime);
$num=0;$fi=0;$aa=0;$mw=0;$i=0;

while ($_ = $ARGV[0]) {
    if ($_=~/time...*.csv/){

    $filename = $ARGV[0];
    print $filename,"\n";
    open (F, $ARGV[0]);# || dir "cat't open file: $!";
    $mtime = (stat $filename)[9];   $mYMD = strftime '%Y/%m/%d', localtime $mtime;  $mHM = strftime '%H:%M', localtime $mtime;
    $date = $mYMD; $datest[$fi]=$date; $fi++;


    while (<F>) {
        $numbStringFile++;
        $str2[$i] = $_;
        $str2[$i] =~ s/\&amp\;/\n/g; #delete &
        ($namecom[$i]) = ($str2[$i] =~ /^(\w+)/); #find first world
        $i++;
    }
        close (F);
    }   else {
            print "FAIL!!!";
            break;
    }
shift;
}


@comp=@namecom;
#    my %hash;
    foreach my $element (@comp) {$hash{$element}++;}
    @comp = keys (%hash);

foreach $hz (@comp)
{
    $dspeed=0;$col=0;
    for ($z=0;$z<$i;$z++)
    {
        if (grep {/$hz/} $str2[$z])
        {
            $col++;
            (@sp) = split(/;/,$str2[$z]); $speed[$z]=@sp[5]; chomp ($speed[$z]);
            $dspeed +=$speed[$z];

        }

    }
        print $hz,"\t",$dspeed/$col,"\n";
}

:q!
[root@game /home/odm/testing]# cat m3
#!/usr/bin/perl
use POSIX qw (strftime);
$num=0;$fi=0;$aa=0;$mw=0;$i=0;

while ($_ = $ARGV[0]) {
    if ($_=~/time...*.csv/){

    $filename = $ARGV[0];
    print $filename,"\n";
    open (F, $ARGV[0]);# || dir "cat't open file: $!";
    $mtime = (stat $filename)[9];   $mYMD = strftime '%Y/%m/%d', localtime $mtime;  $mHM = strftime '%H:%M', localtime $mtime;
    $date = $mYMD; $datest[$fi]=$date; $fi++;


    while (<F>) {
        $numbStringFile++;
        $str2[$i] = $_;
        $str2[$i] =~ s/\&amp\;/\n/g; #delete &
        ($namecom[$i]) = ($str2[$i] =~ /^(\w+)/); #find first world
        $i++;
    }
        close (F);
    }   else {
            print "FAIL!!!";
            break;
    }
shift;
}


@comp=@namecom;
#    my %hash;
    foreach my $element (@comp) {$hash{$element}++;}
    @comp = keys (%hash);

foreach $hz (@comp)
{
    $dspeed=0;$col=0;
    for ($z=0;$z<$i;$z++)
    {
        if (grep {/$hz/} $str2[$z])
        {
            $col++;
            (@sp) = split(/;/,$str2[$z]); $speed[$z]=@sp[5]; chomp ($speed[$z]);
            $dspeed +=$speed[$z];

        }

    }
        print $hz,"\t",$dspeed/$col,"\n";
}




в консоли 
testing]$ ./m3 time080609_*
time080609_064748.csv
time080609_084824.csv
time080609_140745.csv
time080609_154334.csv
time080609_164353.csv
profile 0.224117562884514
thunderpass     0.05857655207316
scenario        0.0617629442459667
library 0.1641442974408
rating  0.0596193586077143
duelfight       0.0797267879049167
city    0.0912417478339364
manage_objects  0.06533122062685
objects 0.06829326152805
view_progress   0.173910140991
petitions       0.0504851341248
arena   0.102865402872973
help    0.0813515166104712
training_mission        0.119192089353286
centre  0.068196551005
xmap    0.107584057183107
worldcontrol    0.057726562023175
chat    12.4510466194158
sampledf        0.07536292076109
index   0.0400535638023202
manage_question 0.0822335879009
user_manage     0.0563573837280333
questfulfil     0.0973893837494954
quest_manage    0.0606780476040289

в итоге получается среднее всех файлов. а как мне считать среднее каждого файла и выводить в такой табличке?





PM MAIL   Вверх
ginnie
Дата 23.6.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Цитата(scion @  23.6.2009,  12:40 Найти цитируемый пост)
а как мне считать среднее каждого файла и выводить в такой табличке

Надо сделать функцию обработки одного файла и выводить результат ее работы на каждой итерации (т.е. для каждого файла). В каком месте у Вас возникла проблема?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
scion
Дата 23.6.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



Цитата(ginnie @ 23.6.2009,  12:57)
Цитата(scion @  23.6.2009,  12:40 Найти цитируемый пост)
а как мне считать среднее каждого файла и выводить в такой табличке

Надо сделать функцию обработки одного файла и выводить результат ее работы на каждой итерации (т.е. для каждого файла). В каком месте у Вас возникла проблема?


если выводить с каждого файла, то не получится построить таблици... .т.е данные нужна засунуть в массив. что бы их выводить в том порядке тоторый требуется... желательно двумерный... ээ

в си я могу написать примерно так:
massiv[i,j]
и выводить строку с увелич. j

как в перле быть с двухмерными массивами... не понимаю я млин. ваших хэшей... ###. рыдать...

Это сообщение отредактировал(а) scion - 23.6.2009, 13:13
PM MAIL   Вверх
ginnie
Дата 23.6.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



scion, про таблицу я пропустил. Для удобного вывода таблицы необходимо исходные данные записать в хэш формата:

%hash = {
    module1 => {
        data1 => [ sum, count ],
        data2 => [ sum, count ],
        ...
    }
    module2 => {
        data1 => [ sum, count ],
        data2 => [ sum, count ],
        ...
    }
    ...
};

кроме этого понадобятся: массив с отсортированными датами и массив с названиями модулей (его можно создать в процессе обработки данных из файлов).


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 23.6.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



scion, хотел было помочь Вам, но понял, что ничего не понял.
Цитата(scion @  23.6.2009,  12:40 Найти цитируемый пост)
нужно вытаскивать имя модуля, и время генерации. 
т.е.index и 0.0375900268555
в этоге должна получится табличка:
         дата                       дата                       ....
комп. сред.время ген.     сред  время генерации
комп2 ....
...
как мне считать среднее каждого файла и выводить в такой табличке?
Откуда брать комп и комп2? Это IP типа 33.241.45.11 в файлах? 
В табличке нет имени модуля. Зачем его вытаскивать?
Усреднять время нужно по чему? По файлам или по компам или по модулям?
Вы определяете дату файла. Разве в имени файла не дата? Если да, то проще ее из имени взять.

В общем, если нужна помощь, сформулируйте задачу четко, иначе ответы Вам неизбежно будут столь же не конкретны, насколько неточно сформулирована задача.



Это сообщение отредактировал(а) amg - 23.6.2009, 15:32
PM MAIL   Вверх
scion
Дата 23.6.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



Цитата(amg @ 23.6.2009,  15:22)
scion, хотел было помочь Вам, но понял, что ничего не понял.
Цитата(scion @  23.6.2009,  12:40 Найти цитируемый пост)
нужно вытаскивать имя модуля, и время генерации. 
т.е.index и 0.0375900268555
в этоге должна получится табличка:
         дата                       дата                       ....
комп. сред.время ген.     сред  время генерации
комп2 ....
...
как мне считать среднее каждого файла и выводить в такой табличке?
Откуда брать комп и комп2? Это IP типа 33.241.45.11 в файлах? 
В табличке нет имени модуля. Зачем его вытаскивать?
Усреднять время нужно по чему? По файлам или по компам или по модулям?
Вы определяете дату файла. Разве в имени файла не дата? Если да, то проще ее из имени взять.

В общем, если нужна помощь, сформулируйте задачу четко, иначе ответы Вам неизбежно будут столь же не конкретны, насколько неточно сформулирована задача.

ок.

есть файлы... много...
такого содержания:
файл созданый 23.07.09

index;;/index.php;33.241.45.11;1244436502;0.0375900268555
index;;/index.php;77.241.45.11;1244436457;0.0375270843506
chat;;/index.php;77.241.45.11;1244436458;0.0577089977264
index;;/index.php;77.241.45.11;1244436465;0.0376060009003
inad;;/index.php;77.241.45.11;1244436472;0.0377838611603
index;;/index.php;77.241.45.11;1244436476;0.0371870994568
xmap;df;/xmap.php?option=getheroes&x=-6&y=7&_=1244436351824;44.155.184.33;1244436205;0.0984649658203
...


файл созданый 22.07.09

chat;;/index.php;77.241.45.11;1244436458;0.0677089977264
xmap;df;/xmap.php?option=getheroes&x=-6&y=7&_=1244436351824;44.155.184.33;1244436205;0.0984649658203
...

в них складывается инфа. разделяемая ; (csv файл)

нужно вытаскивать имя модуля, и время генерации (время генерации вытаскивается среднее для компонента). 
т.е. для первой строчки имя модуля будет index, а время генерации 0.0375900268555

собственно, что нудно, нужна таблица вида:

                             дата                       дата                       ....
компонет1. среднее время ген.     сред  время генерации
компонет2 ....
в нашем случаи: (для куска файла который я скопировал) таблица выглядит так:


         23.07.09      22.07.09   ......n смотря сколько файлов я передаю скрипту...
index   0.37             0                   
chat    0.05             0.067
inad    0.0377          0
xmap   0.098           0.098
...

Это сообщение отредактировал(а) scion - 23.6.2009, 15:56
PM MAIL   Вверх
amg
Дата 23.6.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(scion @  23.6.2009,  15:54 Найти цитируемый пост)
файл созданый 23.07.09
За один день только один файл или может быть несколько? Другими словами, таблицу составлять по дням или по файлам?

PM MAIL   Вверх
scion
Дата 23.6.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



Цитата(amg @ 23.6.2009,  18:10)
Цитата(scion @  23.6.2009,  15:54 Найти цитируемый пост)
файл созданый 23.07.09
За один день только один файл или может быть несколько? Другими словами, таблицу составлять по дням или по файлам?

только один. по дням
PM MAIL   Вверх
amg
Дата 24.6.2009, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



scion, попробуйте приложенный код, реализующий советы ginnie. Таблица будет по дням, т.е. несколько файлов одного и того же дня (если вдруг такие будут) объединятся.
Код
#!/usr/bin/perl -w
use strict;

my (%table, %components);

while (@ARGV) {
  my $filename = shift;
  my ($mday,$mon,$year) = (localtime((stat $filename)[9]))[3..5];
  my $date = sprintf "%04d%02d%02d", $year+1900,$mon+1,$mday;
    
  open F, $filename or die "Can't open $filename: $!\n";
  while (<F>) {
    my ($component, $time) = m/^(\w+);.*;(\d+(?:\.\d+)?)$/ or next;
    $components{$component} = 1;
    $table{$date}{$component}[0] += $time;
    $table{$date}{$component}[1]++;
    #my $a = $table{$date}{$component} ||= [0,0];
    #$a->[0] = ($a->[0] * $a->[1] + $time) / ++$a->[1];
  }
  close F;
}

my @dates = sort {$b <=> $a} keys %table;

printf "%-18s", 'COMPONENT';
foreach (@dates) {
  m/(\d\d)(\d\d)(\d\d)$/;
  printf "%10s", "$3.$2.$1";
}
print "\n";

foreach my $component (sort keys %components) {
  printf "%-18s", $component;
  foreach my $date (@dates) {
    my $a = $table{$date}{$component};
    printf "%10.4f", $a ? $a->[0]/$a->[1] : 0;
    #printf "%10.4f", $table{$date}{$component}[0] || 0;
  }
  print "\n";
}
Upd. Немного исправил, заменив алгоритм усреднения на более очевидный.

Это сообщение отредактировал(а) amg - 24.6.2009, 15:47
PM MAIL   Вверх
scion
Дата 24.6.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



Цитата(amg @ 24.6.2009,  08:36)
scion, попробуйте приложенный код, реализующий советы ginnie. Таблица будет по дням, т.е. несколько файлов одного и того же дня (если вдруг такие будут) объединятся.
Код
#!/usr/bin/perl -w
use strict;

my (%table, %components);

while (@ARGV) {
  my $filename = shift;
  my ($mday,$mon,$year) = (localtime((stat $filename)[9]))[3..5];
  my $date = sprintf "%04d%02d%02d", $year+1900,$mon+1,$mday;
    
  open F, $filename or die "Can't open $filename: $!\n";
  while (<F>) {
    my ($component, $time) = m/^(\w+);.*;(\d+(?:\.\d+)?)$/ or next;
    $components{$component} = 1;
    $table{$date}{$component}[0] += $time;
    $table{$date}{$component}[1]++;
    #my $a = $table{$date}{$component} ||= [0,0];
    #$a->[0] = ($a->[0] * $a->[1] + $time) / ++$a->[1];
  }
  close F;
}

my @dates = sort {$b <=> $a} keys %table;

printf "%-18s", 'COMPONENT';
foreach (@dates) {
  m/(\d\d)(\d\d)(\d\d)$/;
  printf "%10s", "$3.$2.$1";
}
print "\n";

foreach my $component (sort keys %components) {
  printf "%-18s", $component;
  foreach my $date (@dates) {
    my $a = $table{$date}{$component};
    printf "%10.4f", $a ? $a->[0]/$a->[1] : 0;
    #printf "%10.4f", $table{$date}{$component}[0] || 0;
  }
  print "\n";
}
Upd. Немного исправил, заменив алгоритм усреднения на более очевидный.

ыы =) госу... даже слов нет. я тут уже пару дней мучаюсь.... =( спасибо большое!
этот код пока сложен для меня...
а как всё данные разделить ; что бы получился csv файл. Тогда можно дует в exele открыть и наблюдать красивую табличку....
т.е.:
COMPONENT;24.06.09;23.06.09;22.06.09;....
arena;0.0437;0.0414;...
....

Это сообщение отредактировал(а) scion - 24.6.2009, 19:00
PM MAIL   Вверх
ginnie
Дата 24.6.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Цитата(scion @  24.6.2009,  18:58 Найти цитируемый пост)
а как всё данные разделить ; что бы получился csv файл

Если по-простому, то так:

Код

printf "%s;", 'COMPONENT';
foreach (@dates) {
  m/(\d\d)(\d\d)(\d\d)$/;
  printf "%s;", "$3.$2.$1";
}
print "\n";

foreach my $component (sort keys %components) {
  printf "%s;", $component;
  foreach my $date (@dates) {
    my $a = $table{$date}{$component};
    printf "%f;", $a ? $a->[0]/$a->[1] : 0;
  }
  print "\n";
}



Цитата(scion @  24.6.2009,  18:58 Найти цитируемый пост)
этот код пока сложен для меня...

А Вы спрашивайте, про то, что не понятно, не бойтесь и не стесняйтесь!

Это сообщение отредактировал(а) ginnie - 24.6.2009, 19:08


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 25.6.2009, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(scion @  23.6.2009,  13:11 Найти цитируемый пост)
как в перле быть с двухмерными массивами... не понимаю я млин. ваших хэшей... ###. рыдать...
Хэши для Вашей задачи -- самое то. Можно, наверное, было бы и массивами обойтись, но тогда код был бы в весколько раз сложнее (длиннее и запутаннее).
Цитата(scion @  24.6.2009,  18:58 Найти цитируемый пост)
этот код пока сложен для меня...
Присоединяюсь к пожеланию ginnie. На всякий случай, чтобы было понятнее, приведу структуру хэша %table:
Код
(
  20090623,
  { chat => ["0.0677089977264", 1], xmap => ["0.0984649658203", 1] },
  20090624,
  {
    chat    => ["0.0577089977264", 1],
    inad    => ["0.0377838611603", 1],
    "index" => ["0.1499102115632", 4],
    xmap    => ["0.0984649658203", 1],
  },
)
Подобные выдачи очень помогают при отладке сложных структур, их позволяет получать стандартный модуль Data::Dumper (или Data::Dump, последний надо устанавливать, но мне он больше нравится, т.к. дает более компактный аутпут). 

PM MAIL   Вверх
scion
Дата 25.6.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



спасибо большое!

что делает  => и ->
и что будет если в программу передать несколько файлов с одинаковой датой создания?
PM MAIL   Вверх
amg
Дата 25.6.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(scion @  25.6.2009,  13:46 Найти цитируемый пост)
что делает  => и ->
=> применяется для записи хэшей, $key => $value, это почти синоним запятой. -> совсем другое, это оператор разименования ссылки.

Цитата(scion @  25.6.2009,  13:46 Найти цитируемый пост)
что будет если в программу передать несколько файлов с одинаковой датой создания?
Цитата(amg @  24.6.2009,  08:36 Найти цитируемый пост)
несколько файлов одного и того же дня (если вдруг такие будут) объединятся


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0966 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.