Как читать списки чисел из файла, используя строковые форматы в OCaml - PullRequest
0 голосов
/ 16 марта 2019

Я хочу получить список чисел, присутствующих в файле в определенном формате.Но я не получил никакого формата (например,% s% d) для списка чисел.

Мой файл содержит следующий текст:

[1;2] [2] 5
[45;37] [9] 33
[3] [2;4] 1000

Я попробовал следующее

value split_input str fmt =  Scanf.sscanf str fmt (fun x y z -> (x,y,z));

value rec read_file chin acc fmt =
      try let line = input_line chin in
      let (a,b,c) = split_input line fmt in 
      let acc = List.append acc [(a,b,c)] in
            read_file chin acc fmt
      with 
      [ End_of_file -> do { close_in chin; acc}
      ];

value read_list = 
      let chin = open_in "filepath/filename" in
      read_file chin [] "%s %s %d";

Проблема с форматом, указанным ближе к концу.Я использовал тот же код для получения данных из какого-то другого файла, где данные были в формате (строка * строка * int).

Чтобы повторно использовать тот же код, я должен получить вышеуказанный текст в строке, а затемразделить по моему требованию.Мой вопрос: существует ли такой формат, как% s% d для списка целых чисел, так что я получаю список непосредственно из файла вместо того, чтобы писать другой код для преобразования строки в список.

1 Ответ

1 голос
/ 16 марта 2019

Нет встроенного спецификатора для списков в Scanf. Можно использовать спецификатор %r для делегирования синтаксического анализа пользовательскому сканеру, но Scanf на самом деле не предназначен для синтаксического анализа сложного формата:

let int_list b = Scanf.bscanf b "[%s@]" (fun s ->
  List.map int_of_string @@ String.split_on_char ';' s
)

Тогда с этим int_list парсером мы можем написать

let test = Scanf.sscanf "[1;2]@[3;4]" "%r@%r" int_list int_list (@)

и получите

val test: int list = [1; 2; 3; 4]

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

P.S .: Вам, вероятно, следует избегать пересмотренного синтаксиса, он вышел из употребления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...