首页 > 解决方案 > 从文件中解析 OCaml 中的行

问题描述

我对 OCaml 很陌生,我需要编写一个函数,将文件的每一行解析为一个包含三个元素的列表。

在下面的例子中,我想解析 Aemilia、np 和 Aemilia_____1

Aemilia 100 np  [pred="Aemilia_____1<Suj:(sn)>",@hum,@first_name,cat=np,@fs]    Aemilia_____1   Default fs  %default    nc-1fs

extract_line 会返回

Aemilia; np; Aemilia_____1 (I guess this is string * string * string)

实际上我有这样的东西,但我不知道如何实现它(在 C 中很容易:-/)

let extract_line str = 

;;

let rec extract ic = 
  let accum = [] in
    let line = In_channel.input_line ic in
      match line with 
        | None -> accum::[]
        | Some x -> accum :: extract_line x :: extract ic

  In_channel.close ic;;

标签: fileparsingocaml

解决方案


您没有提供有关输入行的可能形式的足够信息来仔细解决此问题。

假设您想要行中的第 1、3 和第 5 个“单词”(空格分隔的值)是合理的。

let get_words =
    let re = Str.regexp "[ \t]+" in
    fun s ->
        Str.split re s

let extract ic =
    let rec loop accum =
        match input_line ic with
        | line ->
            (match get_words line with
            | w1 :: _ ::  w3 :: _ :: w5 :: _ ->
                loop ((w1, w3, w5) :: accum)
            | _ -> loop accum
            )
        | exception End_of_file -> List.rev accum
     in
     loop []

该行的第四个值看起来相当复杂。如果它可以包含嵌入的空格,则需要对每一行进行更仔细的分析。(例如,您可能需要寻找匹配的方括号。但是值是否也可以包含方括号?)

(你说这在 C 中很容易,但是想想你想象中的 C 代码在很长的输入行的情况下会如何表现很有趣。一旦你正确处理了这些事情,根据我的经验,C 变得更加困难。每个程序都会成为内存管理问题。)


推荐阅读