Forum Webscript.Ru

Программирование => Perl => Тема начата: Kopyta от 18 Августа 2005, 16:26:01

Название: Нужна помощь в разборе строки!
Отправлено: Kopyta от 18 Августа 2005, 16:26:01
Есть текстовый файл, куда пишется статистика и который необходимо разобрать построчно. Трудность в том, что все записи в одной строке без какого-либо разделителя…
Длина каждой записи от 50 до 350 байт. По первым 3 байтам можно определить тип записи и длину записи (в байтах).
В теории представляется такой цикл:
1. Читаются первые три байта, по ним определяется длина записи (тип записи и длину записи берём из ассоциативного массива).
2. Далее, после последнего байта определенной (выше) строки ставим символ новой строки.
3. Дописываем в новый файл.

В теории ясно, а вот с практикой, увы… застрял.

У кого есть варианты решения?
Название: Нужна помощь в разборе строки!
Отправлено: arto от 18 Августа 2005, 18:51:45
perldoc -f sysread
Название: Нужна помощь в разборе строки!
Отправлено: Kopyta от 19 Августа 2005, 09:09:47
arto
На примере можно показать?
Название: Нужна помощь в разборе строки!
Отправлено: arto от 19 Августа 2005, 19:51:34
чего показать? как читать документацию?
Название: Нужна помощь в разборе строки!
Отправлено: Kopyta от 22 Августа 2005, 09:34:31
arto

Очень остроумно... Рад за Ваше чувство юмора. Люди желающие помочь - помогают.
Ясно же спросил Вас, как эту функцию реализовать в моём примере на практике.
Название: Нужна помощь в разборе строки!
Отправлено: ondr от 22 Августа 2005, 11:08:18
[off]Kopyta
совет: попробуй начать с того, к чему ты на данный момент пришел. маловероятно, что кто либо захочет тебе писать весь скрипт целиком, а вот помочь - запросто[/off]
Название: Нужна помощь в разборе строки!
Отправлено: Kopyta от 22 Августа 2005, 12:00:50
ondr

Спасибо за совет. Я не хочу, что бы мне всё написали. Хочу сделать это САМ. С Perl-ом сталкивался поверхностно и вот сейчас есть необходимость написать свой parser на Perl-е. Мне хотя бы \'ниточку\' что бы мысли направить в нужном направлении...
Вышеизложенную задачу я решил, но мне думается несколько \'коряво\', а хочется более приятное и маленькое решение. Вот и спрашиваю варианты решения. Может у кого-то есть свои мысли...
Название: Нужна помощь в разборе строки!
Отправлено: Ivan Kolesnikov от 22 Августа 2005, 12:59:15
Kopyta вот мое решение.


use strict;

open(IN, "open(OUT, ">out.txt");

my %lens = (aaa => 10, bbb => 12, ccc => 3);
my $type;
my $element;

while (sysread(IN, $type, 3)) {
  unless (exists $lens{$type}) {
    print "Can not find type $type\\n";
    last;
  };
  sysread(IN, $element, $lens{$type});
  print OUT $element . "\\n";
};

close(IN);
close(OUT);

Хотя было бы полезнее если ты бы показал свое "корявое" решение, может быть и мое ничуть не лучше.
Название: Нужна помощь в разборе строки!
Отправлено: Ivan Kolesnikov от 22 Августа 2005, 13:01:35
Спасибо arto за эту функцию, почитай документацию там ведь все написано, к тому же мысли у тебя правильные были.
Название: Нужна помощь в разборе строки!
Отправлено: vladsu от 22 Августа 2005, 20:02:44
Посмотрите эту книгу Data Munging with Perl (http://www.manning.com/books/cross)
Название: Нужна помощь в разборе строки!
Отправлено: arto от 22 Августа 2005, 20:27:51
$/ = \\3;
while () {
  local $/ = \\$_;
  my $str = ;
  ...
}
Название: Нужна помощь в разборе строки!
Отправлено: Kopyta от 23 Августа 2005, 10:05:52
vladsu
Спасибо за ссылку, по возможности посмотрю...

arto
Спасибо за пример, правда не sysread... но тем не менее спасибо :)

Ivan Kolesnikov
Интересный вариант. У меня определенно хуже :)
Решил путём функций substr, unpack и открытием файла для записи в цикле. Немножко громоздко, но как грабли.

P.S. Небольшая неточность по Вашему примеру. В результате исполнения кода, в файл будут записаны строки без первых трех байтов, а надо бы с ними.

всем
Спасибо за то, что прочитали и привели свои примеры. Буду думать над улучшением производительности... Вообще-то решений, оказывается много. Если у кого ёще есть мысли - пишите. С позволения модератора, пускай тема будет открыта.
Название: Нужна помощь в разборе строки!
Отправлено: Ivan Kolesnikov от 23 Августа 2005, 11:01:44
Цитировать

P.S. Небольшая неточность по Вашему примеру. В результате исполнения кода, в файл будут записаны строки без первых трех байтов, а надо бы с ними.

Это не неточность, просто я так понял, но исправить ведь не сложно :)