Используя PARSE на ПОРТ!значение - PullRequest
3 голосов
/ 08 ноября 2010

Я пытался использовать PARSE на порту! и это не работает:

>> parse open %test-data.r [to end]  
** Script error: parse does not allow port! for its input argument

Конечно, это работает, если вы читаете данные в:

>> parse read open %test-data.r [to end]  
== true

... но, похоже, было бы полезно использовать PARSE для больших файлов без предварительной загрузки их в память.

Есть ли причина, по которой PARSE не может работать с ПОРТОМ! ... или это просто еще не реализовано?

Ответы [ 2 ]

6 голосов
/ 09 ноября 2010

простой ответ: нет, мы не можем ...

Способ синтаксического анализа работает, возможно, потребуется откат к предыдущей части строки ввода, которая может фактически быть заголовком полного ввода, когда он встречает последний символ потока.

порты копируют свои данные в строковый буфер по мере того, как они получают входные данные от порта, так что на самом деле никогда не существует «предыдущей» строки для анализа, которую можно откатить. это как квантовая физика ... просто смотреть на это, его больше нет.

Но, как вы знаете, в реболе ... нет, это не ответ. ; -)

При этом существует способ проанализировать данные из порта по мере его захвата, но это немного больше работы.

вы используете буфер и

APPEND buffer COPY/part connection amount

В зависимости от ваших данных, объем может быть 1 байт или 1 КБ, используйте то, что имеет смысл.

Когда новый вход добавлен в ваш буфер, проанализируйте его и добавьте логику, чтобы узнать, соответствует ли часть этого буфера.

Если что-то совпадало положительно, вы удаляете / разделяете то, что совпало из буфера, и продолжаете анализ, пока ничего не анализируется.

затем повторяйте выше, пока не дойдете до конца ввода.

Я использовал это на tcp-сервере EDI в реальном времени, который имеет tcp-порт «всегда включен» для того, чтобы разбить (потенциально) непрерывный поток входных данных, который на самом деле представляет собой сквозные сообщения.

подробности

Лучший способ настроить эту систему - использовать / no-wait и цикл до закрытия порта (вы не получите ничего вместо "").

Также убедитесь, что у вас есть способ проверки на проблемы целостности данных (например, пропущенный байт или ошибочное сообщение) при разборе, в противном случае вы никогда не достигнете конца.

В моей системе, когда размер буфера превышал определенный размер, я пробовал альтернативное правило, которое пропускало байты, пока шаблон не мог бы быть найден дальше по потоку. Если он обнаружен, регистрируется ошибка, сохраняется частичное сообщение и выдается предупреждение для sysadmin, чтобы разобраться в сообщении.

HTH!

3 голосов
/ 27 ноября 2010

Я думаю, что ответ Максима достаточно хорош.В данный момент анализ порта не реализован.Я не думаю, что это невозможно реализовать позже, но сначала мы должны решить другие вопросы.

Также, как говорит Максим, вы можете сделать это даже сейчас, но это очень зависит от того, что именно вы хотите сделать.

Вы можете анализировать большие файлы без необходимости полностью их считывать в память.Всегда приятно знать, что вы ожидаете разобрать.Например, все большие файлы, такие как файлы для музыки и видео, делятся на куски, так что вы можете просто использовать copy | seek, чтобы получить эти куски и проанализировать их.

Или если вы хотите получить только заголовки из несколькихвеб-страницы, вы можете просто прочитать, скажем, первые 1024 байта и найти тег заголовка здесь, если он не пройден, прочитать больше байтов и повторить попытку ...

Это именно то, что нужно сделать, чтобы разрешитьВ любом случае исходный синтаксический анализ порта.

И не стесняйтесь добавлять WISH в базу данных CureCode: http://curecode.org/rebol3/

...