file - 从文件中解析 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;;
解决方案
您没有提供有关输入行的可能形式的足够信息来仔细解决此问题。
假设您想要行中的第 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 变得更加困难。每个程序都会成为内存管理问题。)
推荐阅读
- tableau-api - 我可以在一个计算字段中进行多项计算吗?
- r - How to use Rvest to scrape data
- java - Java tomcat线程内存使用限制
- android - React Native 不使用 Android Studio 链接模块
- swift - 将模型保存到 Userdefaults 会使应用程序迅速崩溃
- android - 如何调查为什么 gradle build 使用缓存的资源 ID
- java - Spring preAuthorize SpEL查询的日志结果?
- java - 压缩机是抽象的;无法实例化
- ios - Xcode 找不到任何与“应用程序名称”匹配的 iOS 应用程序开发配置文件
- java - 如何修复异常:getOutputStream() 已为此响应调用?