eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Оффтоп —› Perl - Подсчет элементов с учетом второго параметра
Посл.ответ Сообщение


Ранг: 630.4 (!)
Статус: Участник
CyberMonk

Создано: 30 июля 2014 21:05 · Поправил: mak New!
Цитата · Личное сообщение · #1

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

Имеется текстовый документ, где в каждой строке записаны данные в формате

Code:
  1. Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_1, IDD_1
  2. Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_2, IDD_2
  3. Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_3, IDD_3
  4. Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_3, IDD_4
  5. Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_3, IDD_5
  6. Data1, Namber, 02.01.2014 06:27:00, 00002, Data3_3, IDD_4
  7. Data1, Namber, 02.01.2014 06:27:00, 00002, Data3_3, IDD_5
  8. Data1, Namber, 02.01.2014 06:27:18, 00003, Data3_1, IDD_1
  9. Data1, Namber, 02.01.2014 06:27:19, 00003, Data3_3, IDD_3
  10. Data1, Namber, 02.01.2014 06:27:19, 00003, Data3_3, IDD_4
  11. Data1, Namber, 02.01.2014 06:27:19, 00003, Data3_3, IDD_1
  12. Data1, Namber, 02.01.2014 06:27:19, 00003, Data3_3, IDD_5
  13. Data1, Namber, 02.01.2014 06:27:26, 00004, Data3_3, IDD_3
  14. Data1, Namber, 02.01.2014 06:27:26, 00004, Data3_3, IDD_4
  15. Data1, Namber, 02.01.2014 06:27:26, 00004, Data3_3, IDD_5
  16. Data1, Namber, 02.01.2014 06:30:21, 00005, Data3_3, IDD_3
  17. Data1, Namber, 02.01.2014 06:30:21, 00005, Data3_3, IDD_4
  18. Data1, Namber, 02.01.2014 06:30:21, 00005, Data3_3, IDD_5
  19. Data1, Namber, 02.01.2014 06:30:42, 00006, Data3_3, IDD_3
  20. Data1, Namber, 02.01.2014 06:30:42, 00006, Data3_3, IDD_4
  21. Data1, Namber, 02.01.2014 06:30:42, 00006, Data3_3, IDD_1
  22. Data1, Namber, 02.01.2014 06:30:42, 00006, Data3_3, IDD_5


Мне нужно посчитать количество конкретного элемента, который находится в 6 ом столбце, только один раз учитывая 4 столбец с возрастающими номерами, например IDD_4 .. то есть учитывая 4 стобец, где в пределах индекса номер один результат подсчета может быть только 1 или 0 .. если же там два элемента, учитываться будет только один, из двух или трех IDD_4, в любом одинаковом индексе будет подсчитан только один.

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

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

Помогите пожалуйста с реализацией счета по двум параметрам ...

П.С. В архиве лежит файл Search.pl, мне уже пытались помочь, но этот скрипт не работает так как надо. Во первых файл читается из самого перл скрипта, а мне надо чтобы передавался как параметр из БАТ файла как уже сделано у меня. В таком случае у меня не получается сделать сплит, разделение по условию пробел и запятая, так как я не знаю как поймать хэндл в перл скрипте от передаваемого из бат файла имени ..

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

Я уже сильно замучился с этой простой задачей ... но решить ее мне надо к сожалению Перл скриптом, иначе бы не возникло вообще никаких вопросов! .. Спасибо за отклик!

Ссылка --> Link <--


Ранг: 988.8 (! ! !)
Статус: Участник

Создано: 30 июля 2014 21:14 · Поправил: reversecode New!
Цитата · Личное сообщение · #2

Code:
  1. my $filename = './Data.txt';


на кажется так, или без return уже не помню
без
Code:
  1. my $filename=shift || die "need filename";

и сможешь файл в командную строку подсовывать

что кого куда как посчитать.., с остальным нихрена не понятно

| Сообщение посчитали полезным: mak



Ранг: 630.4 (!)
Статус: Участник
CyberMonk

Создано: 30 июля 2014 21:43 · Поправил: mak New!
Цитата · Личное сообщение · #3

reversecode Спасибо! Я попробую этот вариант ..

Не знаю как проще объяснить, ищется количество IDD_4 во всем файле, без учета повторений в индексах которые начинаются с 0000 ....

Если будет так ... ищем IDD_4
Code:
  1. Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_1, IDD_4
  2. Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_2, IDD_4
  3. Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_3, IDD_4


Рузультат будет 1 , а не 3


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

Рузультат будет 1 , а не 3
потому что 00001 все три раза одинаковые?

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

Запись в порядке следования 3 ий индекс а потом первый не может быть правильной изначально, это хорошо видно в самом файле Data.txt
Code:
  1. 00003 
  2. 00001
такой записи не будет. Но принцип подсчета правильный ... ищется исключительно 'IDD_4', точнее его наличие в диапазоне индекса начинающегося с 00001 .. Мой пример в архиве как раз считает все подряд, по заданному IDD_5 ... не учитывая индекс от 00001 и дальше

Код
Code:
  1. #!/usr/bin/perl -w
  2.  
  3. $pat = "IDD_5"; #
  4. $count = 0; #
  5.  
  6.  
  7. chomp($pat = $pat);
  8. while (<>) {
  9.   while (/$pat/g) {
  10.          $count++;
  11.      }
  12.  }
  13. print "$count ,";


В файле Data.txt есть определенная структура, которая не требует сортировки, так как в целом все строчки уже есть продукт сортировки.


Ранг: 988.8 (! ! !)
Статус: Участник

Создано: 30 июля 2014 21:49 · Поправил: reversecode New!
Цитата · Личное сообщение · #4

если ты айтишник - значит должен уметь доходчиво объяснить
без учета повторений индексов, зачем тогда вообще все эти поля?
тупо посчитай общее количество последнего поля которое IDD_

тогда вообще можно посчитать количество строк
ведь во всех у них последнее поле IDD

или исключительно 'IDD_4' ищется?

Добавлено спустя 34 минуты
mak пишет:
Рузультат будет 1 , а не 3

потому что 00001 все три раза одинаковые?

а если так то 2 ?
01.Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_1, IDD_4
02.Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_2, IDD_4
03.Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_3, IDD_4
04.Data1, Namber, 02.01.2014 06:26:46, 00002, Data3_1, IDD_4
05.Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_2, IDD_4
06.Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_3, IDD_4

а так то 3 ?
01.Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_1, IDD_4
02.Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_2, IDD_4
03.Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_3, IDD_4
04.Data1, Namber, 02.01.2014 06:26:46, 00002, Data3_1, IDD_4
05.Data1, Namber, 02.01.2014 06:26:46, 00003, Data3_2, IDD_4
06.Data1, Namber, 02.01.2014 06:26:46, 00001, Data3_3, IDD_4

я правильно понимаю что нужно сначала выбрать все поля у которых есть IDD_4
а потом сгруппировать по 6 столбцу и узнать количество уникальных ?

Добавлено спустя 1 час 58 минут
оффтоп не является разделом форума, здесь нет смысла редактировать сообщения!

так, после того как выбрали IDD_4 , последовательность самих индексов как то должны учитываться?
или все же можно их uniq и count ?


Ранг: 630.4 (!)
Статус: Участник
CyberMonk

Создано: 31 июля 2014 07:38 · Поправил: mak New!
Цитата · Личное сообщение · #5

reversecode пишет:
так, после того как выбрали IDD_4 , последовательность самих индексов как то должны учитываться?
или все же можно их uniq и count ?


Последовательность самих индексов не учитывается, их можно сделать uniq и count, не учитывая остальные параметры строчки. На длину строчек ориентироватья нельзя, так как она всегда разная из-за параметра Data1, Namber, который тоже не должен учитываться. Поэтому указать точно положение сравниваемых данных нельзя. Так я уже через блокнот пробовал.

reversecode пишет:
Добавлено спустя 1 час 58 минут
оффтоп не является разделом форума, здесь нет смысла редактировать сообщения!


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

Добавлено спустя 10 часов 14 минут
reversecode Спасибо за совет с хэндлом, этот вопрос решен ... теперь остается только два вопроса, как убирать нули перед индексом? Чтобы я мог нормально применить уже имеющийся скрипт, данные обновленные я загрузил на ргхост ...

И второй вопрос, т.к. мне надо считать всего лишь один параметр IDD_4 к примеру, то условия

Code:
  1. if    ($data3_value eq 'IDD_4') { $occurrences{'IDD_4'}{$data2_value} = 1; }
  2.         elsif ($data3_value eq 'IDD_5') { $occurrences{'IDD_5'}{$data2_value} = 1; }
  3.         elsif ($data3_value eq 'IDD_6') { $occurrences{'IDD_6'}{$data2_value} = 1; }
  4.         elsif ($data3_value eq 'IDD_7') { $occurrences{'IDD_7'}{$data2_value} = 1; }
  5.         else                              { die "error! Data 3 has unknow value!\n"; };



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

Нули я пробовал убирать разными методами, один из них это
Code:
  1. # my $data2_value =~ s/\0+$//;
но в ничего не получилось, во первых я не знаю будет ли это в цикле, во вторых выдает ошибку, параметр $data2_value не инициализирован, хотя при тесте нормальном без нулей, которые убрал вручную для пробы, и когда везде последовательно идут IDD_4, то скрипт отрабатывает.

Ссылка --> Link <-- Заранее Спасибо

Ранг: 53.9 (постоянный)
Статус: Участник

Создано: 1 августа 2014 03:50 New!
Цитата · Личное сообщение · #6

mak пишет:
Нули я пробовал убирать разными методами, один из них это
...
s/\0+$//;

Регулярка не правильная.
s/^0+//
mak пишет:
параметр $data2_value не инициализирован

Нужно чтобы до этого в $data2_value была эта самая цифра с ведущими нулями.


Ранг: 630.4 (!)
Статус: Участник
CyberMonk

Создано: 1 августа 2014 07:44 · Поправил: mak New!
Цитата · Личное сообщение · #7

Zorn пишет:
mak пишет:
Нули я пробовал убирать разными методами, один из них это
...
s/\0+$//;
Регулярка не правильная.
s/^0+//
mak пишет:
параметр $data2_value не инициализирован
Нужно чтобы до этого в $data2_value была эта самая цифра с ведущими нулями.


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


Всем спасибо, решено!
 eXeL@B —› Оффтоп —› Perl - Подсчет элементов с учетом второго параметра

У вас должно быть 20 пунктов ранга, чтобы оставлять сообщения в этом подфоруме, но у вас только 0


Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS