Автор Тема: Нужна помощь в разборе строки!  (Прочитано 7666 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Kopyta

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

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

У кого есть варианты решения?

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Нужна помощь в разборе строки!
« Ответ #1 : 18 Августа 2005, 18:51:45 »
perldoc -f sysread

Оффлайн Kopyta

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
Нужна помощь в разборе строки!
« Ответ #2 : 19 Августа 2005, 09:09:47 »
arto
На примере можно показать?

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Нужна помощь в разборе строки!
« Ответ #3 : 19 Августа 2005, 19:51:34 »
чего показать? как читать документацию?

Оффлайн Kopyta

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
Нужна помощь в разборе строки!
« Ответ #4 : 22 Августа 2005, 09:34:31 »
arto

Очень остроумно... Рад за Ваше чувство юмора. Люди желающие помочь - помогают.
Ясно же спросил Вас, как эту функцию реализовать в моём примере на практике.

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Нужна помощь в разборе строки!
« Ответ #5 : 22 Августа 2005, 11:08:18 »
[off]Kopyta
совет: попробуй начать с того, к чему ты на данный момент пришел. маловероятно, что кто либо захочет тебе писать весь скрипт целиком, а вот помочь - запросто[/off]
0 OK, 0:1

Оффлайн Kopyta

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
Нужна помощь в разборе строки!
« Ответ #6 : 22 Августа 2005, 12:00:50 »
ondr

Спасибо за совет. Я не хочу, что бы мне всё написали. Хочу сделать это САМ. С Perl-ом сталкивался поверхностно и вот сейчас есть необходимость написать свой parser на Perl-е. Мне хотя бы \'ниточку\' что бы мысли направить в нужном направлении...
Вышеизложенную задачу я решил, но мне думается несколько \'коряво\', а хочется более приятное и маленькое решение. Вот и спрашиваю варианты решения. Может у кого-то есть свои мысли...

Оффлайн Ivan Kolesnikov

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 39
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Нужна помощь в разборе строки!
« Ответ #7 : 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

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 39
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Нужна помощь в разборе строки!
« Ответ #8 : 22 Августа 2005, 13:01:35 »
Спасибо arto за эту функцию, почитай документацию там ведь все написано, к тому же мысли у тебя правильные были.

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Нужна помощь в разборе строки!
« Ответ #9 : 22 Августа 2005, 20:02:44 »
Посмотрите эту книгу Data Munging with Perl
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Нужна помощь в разборе строки!
« Ответ #10 : 22 Августа 2005, 20:27:51 »
$/ = \\3;
while () {
  local $/ = \\$_;
  my $str = ;
  ...
}

Оффлайн Kopyta

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
Нужна помощь в разборе строки!
« Ответ #11 : 23 Августа 2005, 10:05:52 »
vladsu
Спасибо за ссылку, по возможности посмотрю...

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

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

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

всем
Спасибо за то, что прочитали и привели свои примеры. Буду думать над улучшением производительности... Вообще-то решений, оказывается много. Если у кого ёще есть мысли - пишите. С позволения модератора, пускай тема будет открыта.

Оффлайн Ivan Kolesnikov

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 39
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Нужна помощь в разборе строки!
« Ответ #12 : 23 Августа 2005, 11:01:44 »
Цитировать

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

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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28