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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение по файлу, перемещение по файлу, считывание  
V
    Опции темы
bamper
Дата 18.6.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте многоуважаемые.

У меня такой вот вопрос по работе с файлами. Я обрабатываю файл следующего содержания:

ISA00          0804041802U004030000038200P:  filename1.txt    28029
ISA01   097509996  6111492199200804041802
...............................................................................................
ISA00          0804041802U004030000038200P:  filename2.txt    28029
ISA01   097509996  6111492199200804041802
...............................................................................................

В файле есть повторяющиеся сегменты.  Я вытаскиваю имена файлов (filename1.txt, filename2.txt и т.д.) которые находятся на одинаковом байтовом смещении (по моему  smile  ) относительно начала строки с полем ISA. Считать первое поле зная значение смещения я могу: seek + read.  Но вот как перейти к следующему сегменту и считать следующий filename, - с этим у меня проблемы.

Обрабатываемый файл может достигать нескольких сотен мегабайт.

PM MAIL   Вверх
tolkien
Дата 18.6.2008, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если размеры считываемых сегментов фиксированы seek+read. Если нет, то только последовательно просматривать каждую строку
PM MAIL   Вверх
ginnie
Дата 18.6.2008, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



bamper, как вариант, сначала создать новый файл, содержащий только строки с ISA00 и его построчно обработать (поле выбирать путем split строки по пробельным символам).

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


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


Новичок



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

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



Цитата(tolkien @ 18.6.2008,  19:17)
Если размеры считываемых сегментов фиксированы seek+read. Если нет, то только последовательно просматривать каждую строку

Нет. Сегменты не фиксированы по размеру. 

PM MAIL   Вверх
Itsys
Дата 18.6.2008, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А почему бы не воспользоваться регулярным выражением?

PM MAIL WWW Skype   Вверх
bamper
Дата 18.6.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Itsys @ 18.6.2008,  19:58)
А почему бы не воспользоваться регулярным выражением?

Можно с примером пожалуйста.

Воспользовавшись подсказкой ginnie я организовал все следующим образом:

Код

open F, "file.txt" or die "Can't $ARGV[0]$file";
my @lines = <F>;
foreach $lines(@lines) 
 {
 if (($lines =~ m/ISA00/) == 1) {
 #сохранение линии в файл и последующая обработка
 }
}


Хм... А как еще к этой строке две послеидущие добавить? Там тоже нужная информация оказалась.

Это сообщение отредактировал(а) bamper - 18.6.2008, 23:33
PM MAIL   Вверх
amg
Дата 19.6.2008, 06:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(bamper @  18.6.2008,  20:39 Найти цитируемый пост)
А как еще к этой строке две послеидущие добавить? 

Это легко (см. код ниже). Только не нужно зачитывать сразу весь большой файл в массив, памяти не хватит -- будет плохо. Лучше читать его построчно, можно тут же и обрабатывать найденные строки.
Код
open F, '<', "file.txt" or die "Can't open file.txt";
while (my $line = <F>) {
  if ($line =~ /^ISA00/) {
    my $line2 = <F> if ! eof;
    my $line3 = <F> if ! eof;
    # Обрабатываем $line, $line2, $line3
    print "1: $line 2: $line2 3: $line3"; 
  }
}
close F;



Это сообщение отредактировал(а) amg - 19.6.2008, 06:46
PM MAIL   Вверх
Bulat
Дата 19.6.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


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

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



bamper, ИМХО, проще применить на регулярные выражения. Только я не до конца понял, что именно Вам нужно получать из текущей строки smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
bamper
Дата 19.6.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Bulat @ 19.6.2008,  11:38)
bamper, ИМХО, проще применить на регулярные выражения. Только я не до конца понял, что именно Вам нужно получать из текущей строки smile

из строки я вытягиваю filename.txt. я просто split`ую строку я вытягиваю нужный мне аргумент. 
PM MAIL   Вверх
Bulat
Дата 19.6.2008, 14:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


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

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



Код

open(LOGFILE, "file.txt");
while (my $line = <LOGFILE>) {
  chomp($line);
  if ($line =~ /^.*?(filename\d+?\.txt).*?$/) {
    print $1, "\n"; 
  }
}
close(LOGFILE);



--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
bamper
Дата 19.6.2008, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


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

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


 




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


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

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