Forum Webscript.Ru
Программирование => Perl => Тема начата: Kopyta от 18 Августа 2005, 16:26:01
-
Есть текстовый файл, куда пишется статистика и который необходимо разобрать построчно. Трудность в том, что все записи в одной строке без какого-либо разделителя…
Длина каждой записи от 50 до 350 байт. По первым 3 байтам можно определить тип записи и длину записи (в байтах).
В теории представляется такой цикл:
1. Читаются первые три байта, по ним определяется длина записи (тип записи и длину записи берём из ассоциативного массива).
2. Далее, после последнего байта определенной (выше) строки ставим символ новой строки.
3. Дописываем в новый файл.
В теории ясно, а вот с практикой, увы… застрял.
У кого есть варианты решения?
-
perldoc -f sysread
-
arto
На примере можно показать?
-
чего показать? как читать документацию?
-
arto
Очень остроумно... Рад за Ваше чувство юмора. Люди желающие помочь - помогают.
Ясно же спросил Вас, как эту функцию реализовать в моём примере на практике.
-
[off]Kopyta
совет: попробуй начать с того, к чему ты на данный момент пришел. маловероятно, что кто либо захочет тебе писать весь скрипт целиком, а вот помочь - запросто[/off]
-
ondr
Спасибо за совет. Я не хочу, что бы мне всё написали. Хочу сделать это САМ. С Perl-ом сталкивался поверхностно и вот сейчас есть необходимость написать свой parser на Perl-е. Мне хотя бы \'ниточку\' что бы мысли направить в нужном направлении...
Вышеизложенную задачу я решил, но мне думается несколько \'коряво\', а хочется более приятное и маленькое решение. Вот и спрашиваю варианты решения. Может у кого-то есть свои мысли...
-
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);
Хотя было бы полезнее если ты бы показал свое "корявое" решение, может быть и мое ничуть не лучше.
-
Спасибо arto за эту функцию, почитай документацию там ведь все написано, к тому же мысли у тебя правильные были.
-
Посмотрите эту книгу Data Munging with Perl (http://www.manning.com/books/cross)
-
$/ = \\3;
while () {
local $/ = \\$_;
my $str = ;
...
}
-
vladsu
Спасибо за ссылку, по возможности посмотрю...
arto
Спасибо за пример, правда не sysread... но тем не менее спасибо :)
Ivan Kolesnikov
Интересный вариант. У меня определенно хуже :)
Решил путём функций substr, unpack и открытием файла для записи в цикле. Немножко громоздко, но как грабли.
P.S. Небольшая неточность по Вашему примеру. В результате исполнения кода, в файл будут записаны строки без первых трех байтов, а надо бы с ними.
всем
Спасибо за то, что прочитали и привели свои примеры. Буду думать над улучшением производительности... Вообще-то решений, оказывается много. Если у кого ёще есть мысли - пишите. С позволения модератора, пускай тема будет открыта.
-
P.S. Небольшая неточность по Вашему примеру. В результате исполнения кода, в файл будут записаны строки без первых трех байтов, а надо бы с ними.
Это не неточность, просто я так понял, но исправить ведь не сложно :)