Общий алгоритм / шаблон для обработки текстовых файлов - PullRequest
2 голосов
/ 05 февраля 2012

Существует ли общий алгоритм / шаблон для чтения многострочных текстовых файлов, где некоторые строки зависят от предыдущих?Я имею в виду данные в такой форме:

H0 //start header
HEADER1
H9 //end header   
R0 RECORD1
R0 RECORD2
H0 //start header
HEADER2
H9 //end header
R0 RECORD3
R0 RECORD4

Где нужно связать текущую информацию «заголовка» с каждой следующей записью.

Я понимаю, что существует множество решений для этогоТакая задача, но существуют ли проверенные и проверенные шаблоны, на которые сходятся более опытные разработчики?

РЕДАКТИРОВАТЬ: моя интуиция заключается в том, что нужно использовать какой-то конечный автомат, с такими состояниями, как «чтение заголовка», «чтение записей» и т. Д. Я на правильном пути?

РЕДАКТИРОВАТЬ:Хотя пример прост, что-то, что может обрабатывать более высокие степени вложенности, было бы предпочтительным

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

Это можно рассматривать как проблему синтаксического анализа, хотя грамматика языка очень проста.Это действительно обычный , и поэтому FSM, как вы правильно заметили, будет работать.Вообще говоря, любая установленная техника синтаксического анализа будет работать;вы бы избежали явного состояния, если бы использовали рекурсивный анализ спуска , который становится не очень рекурсивным в случае обычного языкаСледующий псевдокод:

function accept_file:
   while not_eof
      read_line;
      case prefix of
         "H0": accept_header;
         "R0": accept_record;
         otherwise: syntax_error;

function accept_record:
   make_record from substring of current_line from position 3;

function accept_header:
   read_line;
   while current_line does not start with "H9"
      add line to accumulated_lines
   create header from accumulated_lines
1 голос
/ 05 февраля 2012

Я согласен с kkm, в зависимости от того, насколько «сложна» ваша грамматика, вы можете рассмотреть возможность использования некоторого вида парсинга lib, например ply

...