Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » perl обработка файла

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

zumicator

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день, есть желание поучиться немного в perl и хочу поработать с текстовым файлом:  

Код:
 
23100|2|0|32|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0|13|0||0|0|0|0|
23101|2|0|33|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0|0|0||0|0|0|0|
23102|2|0|34|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0|0|0||0|0|0|0|
23103|2|0|35|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0|10|0||0|0|0|0|
23104|2|0|36|2|1111|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0||0||0|0|0|0|
23105|2|0|37|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0||0||0|0|0|0|
23106|2|0|38|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0|0|0||0|0|0|0|
23107|2|0|39|0|1111|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0||1|0|0|0|1|0|10|0||0|0|0|0|
23108|2|0|40|0|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0|10|0||0|0|0|0|
23109|2|0|41|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0|0|0||0|0|0|0|
 

 
для осуществления задуманного надёргал кусков из интернетов и получилось вот, что:

Код:
 
#!/usr/bin/perl -w
 
#############################################################
open my $file, '<', 'subscriber-1.unl' or die "Невозможно открыть файл: $!\n";
 
while(<$file>)
{
   
  my $outline = "" ;
  my @fields = split(/\|/, <$file>) ;
    for ($j = 0; $j < @fields; $j++)  
    {
               
        if (($j == 35) )  
        #если полей насчитает 35, то добавит в конце ещё 15 |0|
        {
          $outline = $outline . "0\|" x 15;
        }
    $outline = $outline . "$fields[$j]\|" ;
    }
   
  chop $outline ;
  print $outline;
 
}
 

 
Непонимаю почему здесь после разделения строк на поля я имею на выходе только нечётные строки из файла:
 

Код:
 
23101|2|0|33|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0|0|0||0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
23103|2|0|35|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0|10|0||0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
23105|2|0|37|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0||0||0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
23107|2|0|39|0|1111|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0||1|0|0|0|1|0|10|0||0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
23109|2|0|41|2|1111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0||1|0|0|0|1|0|0|0||0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
 

Всего записей: 12 | Зарегистр. 05-12-2009 | Отправлено: 15:27 24-07-2019
John Lawrence

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хз почему, но так работает:
 

Код:
 
#!/usr/bin/perl -w
 
#############################################################
open my $file, '<', '01.txt' or die "Невозможно открыть файл: $!\n";
 
while( my $line = <$file>)
{
 
  my $outline = "" ;
  my @fields = split(/\|/, $line ) ;
    for ($j = 0; $j < @fields; $j++)
    {
 
        if (($j == 35) )
        #если полей насчитает 35, то добавит в конце ещё 15 |0|
        {
          $outline = $outline . "0\|" x 15;
        }
    $outline = $outline . "$fields[$j]\|" ;
    }
 
  chop $outline ;
  print $outline;
 
}
 

 
Добавлено:
Вероятно с назначением переменной в цикле какая-то беда была, я честно говоря в перле не разбираюсь %-)

Всего записей: 4 | Зарегистр. 25-08-2008 | Отправлено: 17:05 24-07-2019 | Исправлено: John Lawrence, 17:17 24-07-2019
zumicator

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Благодарю.
Это ж сколько скрытых граблей. Буду дальше ковырять.

Всего записей: 12 | Зарегистр. 05-12-2009 | Отправлено: 09:48 26-07-2019
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
my @fields = split(/\|/, <$file>) ;  

Потому, что тут запрашиваете следующую строку, а не используете ту, что пошла в цикле while
Сбиваете итерацию. Используйте тут $_, а не <$file>

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 10:03 26-07-2019 | Исправлено: Mavrikii, 10:07 26-07-2019
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » perl обработка файла


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru