gpt4 book ai didi

list - 如何将 txt 文件中的值解析为 OCaml 中的记录列表?

转载 作者:行者123 更新时间:2023-12-02 03:27:52 28 4
gpt4 key购买 nike

我正在尝试学习 OCaml,但在将文件解析为记录列表时遇到困难。假设我有一个格式如下的文本文件:

吉姆鲍勃,红色
史蒂夫布莱克,蓝色

等..

我希望能够将 csv 解析为一个记录列表,稍后我会用它来进行基本的列表操作,例如排序,记录为:

type person_info =
{
name : string;
favorite_color : string;
}

我有解析函数:

let parse_csv =
let regexp = Str.regexp (String.concat "\\|" [
"\"\\([^\"\\\\]*\\(\\\\.[^\"\\\\]*\\)*\\)\",?";
"\\([^,]+\\),?";
",";
]) in
fun text ->
let rec loop start result =
if Str.string_match regexp text start then
let result =
(try Str.matched_group 1 text with Not_found ->
try Str.matched_group 3 text with Not_found ->
"") :: result in
loop (Str.match_end ()) result
else
result in
List.rev ((if
try String.rindex text ',' = String.length text - 1
with Not_found -> false
then [""] else [])
@ loop 0 [])

这将为我拆分所有内容。但是我不知道如何将内容读入记录列表,甚至无法将其正确解析为数组:

let () =
let ic = open_in Sys.argv.(1) in
let lines = ref [] in
try
while true do

lines := Array.of_list (parse_csv (input_line ic))

done
with End_of_file ->
close_in ic

这在不调用 parse_csv 的情况下也能正常工作,但当我尝试解析时失败。

最佳答案

注意这里有exists a CSV module您可以使用 opam install csv 安装。然后您可以轻松读取文件(在交互式 toploop 中):

# #require "csv";;
/home/chris/.opam/system/lib/csv: added to search path
/home/chris/.opam/system/lib/csv/csv.cma: loaded
# let c = Csv.load "data.csv";;
val c : Csv.t = [["Jim Bob"; "red"]; ["Steve Black"; "blue"]]

然后您可以轻松地将其转换为您喜欢的格式:

# let read_people fname =
Csv.load fname
|> List.map (function [name; favorite_color] -> {name; favorite_color }
| _ -> failwith "read_people: incorrect file");;
val read_people : string -> person_info list = <fun>
# read_people "data.csv";;
- : person_info list =
[{name = "Jim Bob"; favorite_color = "red"};
{name = "Steve Black"; favorite_color = "blue"}]

关于list - 如何将 txt 文件中的值解析为 OCaml 中的记录列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29338331/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com