Forum Webscript.Ru
Программирование => Perl => Тема начата: glebushka от 19 Апреля 2002, 04:08:32
-
Вот никак не могу придумать...
Помогите, плиз...
Есть файл где много-много строчек...
Нужен скрипт который делает следующую вещь:
считывает энти самые строчки и ищет повторения, а потом распечатыает результат, убирая повторяющиеся строчки, НО, напротив каждой строчки ввыводит сколько раз она встречается в файле, по убыванию, например, есть файл:
строка1
строка2
строка1
Результат работы скрипта:
строка1 ..................2раза
строка2 ..................1раз
-
Да, чуть не забыл:) формат у файла конечно же текстовой.
-
#!/usr/bin/perl
open (FILE, "my @file=;
close FILE;
my %count=();
foreach my $strk(@file){ $count{$strk}++;}
map {print "$_ => $count{$_}\\n"} keys %count;
-
ЭЭЭ... этот кусочек кода подсчитывает сколько раз повоторяется но НЕ сортирует записи в порядке убывания (мне нужно, чтобы записи выводились в порядке убывания повторений). Как это сделать, а?
-
#!/usr/bin/perl
# reyting для Глебушки :)
print "Content-type: text/html\\n\\n";
open Data,"data.txt";@dat1=;@dat2=@dat1;close Data;
while (<@dat1>){my $string=$_;
if ($result{$string} ne ""){next;}else {$result{$string}=0;}
foreach $line (<@dat2>){if ($line eq $string){$result{$string}++;}}
if ($string ne ""){print "строка $string встретилась $result{$string} раз
\\n";
push(@sorts,"$result{$string}\\:::$string");
}}
print "Теперь сортитуем по убыванию
\\n";
@sort=@sorts;
$test=1;
while (<@sorts>){
($reyting,$name)=split(/:::/);
if ($reyting >=$test){$test=$reyting}#получили max значение
}
for ($n=$test;$n>=1;$n--){#от мax к минимальному
while (<@sort>){
($reyting,$name)=split(/:::/);
if ($reyting ==$n){print "$name => $reyting
\\n"}
}}
вот такое решение пришло мне в голову :)
-
А вот и не спиши эту галемотью использовать.Я тестировал на файле из 10 строк - работает. Из 10 кБт виснет! Циклы гоняет :(
Надо как-то подругому.....
-
10 кБт виснет! Циклы гоняет
Тыды не пойдёт, а я уж обрадовался:), файлы предполагаются быть достаточно большими... Поэтому скорость выполнения важна...Надо как-то подругому.....
Как? Не подскажите:). А то у меня вообще никаких идей нет что делать с какадувовским кодом дальше..., Green Kakadu, ESE, помогите!!!!!!!!!
-
По скорости у
Green Kakadu
гораздо быстрее работает :)
А над рейтингом подумаем....
-
Вот оно!
100 кБт за 1 секунду! и компактно получилось
#!/usr/bin/perl
print "Content-type: text/html\\n\\n";
open FILE, "data.txt";
@file=;
close FILE;
foreach $line (@file){$res{$line}++;}
foreach $line ( @file ) {
if ($res{$line} >=$test){$test=$res{$line}
} }
$is=1;
for ($n=$test;$n>=1;$n--){
foreach $line ( keys %res ) {
if ($res{$line}==$n){print "На $is месте $line зашедший к нам $n раз(а)\\n
";$is++}}}
-
ESE
Спасибо! Ща пойду тестить на файлах до 200кбт, в файле из 40 строчек работает нормльно, вроде бы:).
Большое Человеческое Спасибо!!!
-
Я на мегобайтном проверял, работало. По времении приблизительно 3-4 секунды процес занял.
-
#!/usr/bin/perl
open (FILE, "my @file=;
close FILE;
my %count=();
foreach my $strk(@file){ $count{$strk}++;}
map {print "$_ => $count{$_}\\n"} sort {$count{$b}<=>$count{$a}} keys %count;
я тогда забыл про сортировку ;)
-
Green Kakadu
Брависимо! Код в полтора раза меньше! Интересно, работает тоже в полтора раза быстрее:-)?
-
Интересно, работает тоже в полтора раза быстрее:-)?
навряд ли, просто ESE довольно своеобразную логику там применил - в Perl есть встроенная функция сортировки.
-
Ну вот вариант покороче первого варианта
open FILE, "data.txt";
@file=;close FILE;
foreach $line (@file){$res{$line}++;
if ($res{$line} >=$test){$test=$res{$line}}}
$is=1;
for ($n=$test;$n>=1;$n--){
foreach $line ( keys %res ) {
if ($res{$line}==$n){print "На $is месте $line зашедший к нам $n раз(а)\\n
";$is++}}}
Ну а по поводу сортировки я к сожалению плохо знаком с оператором sort но как-то пытался его применять, результат был такой : 1 17 2 22 3 38 43 5 56 6 7 тоесть сортировка происходила по первой цифре
:beer:
-
был такой : 1 17 2 22 3 38 43 5 56 6 7 тоесть сортировка происходила по первой цифре
;)
sort lala-lal да даст такой результат, идет сортировка по ANSI кодам.
sort {$a <=> $b} список
по числам
sort {$a cmp $b} список
по ANSI
sort {($a<=>$b)||($a cmp $b)} список
по числам, если они одинаковы - по ANSI кодам
-
Спасибо :) !