Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Разбор строки по правилам  (Прочитано 15049 раз)
0 Пользователей и 1 Гость смотрят эту тему.
gottin
Гость
« : 03-06-2009 12:08 » 

Привет, подскажите пожалуйста как правильно разобрать строки из текстового файла???
есть текстовый файл,приведу в пример несколько строк из него:
$b_in,$pin,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$numb, $clid
26,     760,   5,  25,18,   5,  31, 10,2651,7495, 48531111
26,     020,   5,  25,18,   4,  37, 106,2651,7485,4853112
26,     760,   5,  25,18,   5,  31, 10,  2651,7485,48531111
Задача простая, мне необходимо из этих строчек убрать (выкинуть) информацию, где переменная $clid содержит номер 7853111
и $numb 7495? все остальные параметры связанные с этим номером оставить!!
Вот кусочек кода:
Код:

 while(<IN>)
{
 chomp;
 my ($b_in,$pin,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$numb,$clid) = split /,/;
 next if (($b_in eq "26") and ($clid =~ /^48531111$/) and ($numb!= ~ /^7495$/));
 print OUT "$b_in,$pin,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$numb,$clid\n";
}

Но он убирает все строки связанные с номером 48531111 Жаль  Подскажите что не так и как написать правильно???
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 03-06-2009 12:49 » 

Задача простая, мне необходимо из этих строчек убрать (выкинуть) информацию, где переменная $clid содержит номер 7853111
и $numb 7495? все остальные параметры связанные с этим номером оставить!!

Что ты имеешь в виду (выделено жирным)? Просто присвоить $clid = '' и $numb = ''? Не понятно.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 03-06-2009 12:53 » 

Если требуется точное соответствие - то почему пытаешься сделать проверку через =~//, а не eq?
Записан
gottin
Гость
« Ответ #3 : 03-06-2009 13:21 » 

1. В результате (после обработки скриптом) должно быть так:
26,   020,   5,  25,18,   4,  37, 106,2651,7485,4853112
26,   760,   5,  25,18,   5,  31, 10,  2651,7485,48531111
т. е. строка с кодом 7495 не попадает  в конечный результат.
2. С синтаксисом Perl я честно говоря не очень знакома, но "eq" здесь не прокатит, т.к. после кода 7495 могут быть различные цифры(точное соответствие не прокатит, только приблизительные данные)
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 03-06-2009 13:30 » 

gottin, тогда расскажи что обозначают кванторы ^  и   $
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 03-06-2009 13:31 » 

после кода 7495 могут быть различные цифры(точное соответствие не прокатит, только приблизительные данные)
Тогда шаблон /^7495$/ некорректен, нужно /^7495/ или что-то в духе /^7495\d*/
Записан
gottin
Гость
« Ответ #6 : 03-06-2009 13:47 » 

Попробовала оба варианта - не подходят Жаль, опять убираются все строки связанные с этим номером. Какие в  Perle есть аналоги, скажем sql -левскому оператору not like ? ну или может Хорошую ссылочку подкинете по perlу если не трудно, я бы посмотрела сама Не понял
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 03-06-2009 13:57 » 

Ещё у тебя в тестовом примере есть пробелы, которые попадут в строковые значения. Их тоже нужно учесть или вырезать.

Я тут твой код переделал, сейчас он выводит только те строки, которые не удовлетворяют условию "$clid содержит 48531111 и $numb содержит 7495".
Код:
while(<IN>)
{
 chomp;
 my ($b_in,$pin,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$numb,$clid) = split /,/;
 next if (($b_in eq "26") and ($clid =~ /^\s*48531111\s*$/) and ($numb =~ /^\s*7495\d*\s*/));
 print OUT "$b_in,$pin,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$numb,$clid\n";
}
Но можно, конечно, и поизящнее. скажем, просто считывать строку, не разбирая на параметры, а потом
Код:
next if ( /^26.*\s*7495\d*\s*,\s*48531111\s*$/ );
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 03-06-2009 17:55 » 

Код:
while (<IN>)
{
  # Удаляем потенциально возможные пробелы после последнего числа и перевод строки.
  s/\*$//;
  #
  # Если есть уверенность, что в конце строки нет пробелов, то можно применить chomp.

  # Пробелы съедаются разделителем.
  my ($b_in, $pin, $t1, $t2, $t3, $t4, $t5, $t6, $t7, $numb, $clid) = split /,\s*/;

  # Операторы and и or имею низший приоритет - нет нужды защищаться от них скобками.
  # Существуют аналоги - && и || - с более высоким приоритетом.
  #
  # Здесь выполняем сравнение как числа:
  next if ($b_in == 26 and $clid == 48531111 and $numb == 7495);
  #
  # Или так - как строки:
  # next if ($b_in eq '26' and $clid eq '48531111' and $numb eq '7495');
  #
  # Все зависит от свойств данных...
  #
  # Проверка строки оператором m// нужна только при неконстантном сравнении.

  # OUT - дескриптор для вывода по умолчанию - нет нужды его специально указывать.
  print "$b_in,$pin,$t1,$t2,$t3,$t4,$t5,$t6,$t7,$numb,$clid\n";
}

Главное - логика:
    $b_in == 26
  and
    $clid == 48531111
  and
    $numb == 7495

Это верная логика?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
gottin
Гость
« Ответ #9 : 04-06-2009 06:13 » new

Главное - логика:
    $b_in == 26
  and
    $clid == 48531111
  and
    $numb == 7495

Это верная логика?
 
Почти... единственное только $numb!= 7495 (ну это я может плохо объясняю...), в общем то я поняла как сделать, спасибо большое за помощь!!! Улыбаюсь
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 04-06-2009 06:22 » 

Так не интересно Улыбаюсь
Я не получил ответа Улыбаюсь Впрочем, если задача уже сделана, то будет ли он (ответ)?
gottin, тогда расскажи что обозначают кванторы ^  и   $
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines