OCaml - 将 csv 文件读入数组
OCaml - Read csv file into array
我正在尝试将 OCaml 中的 csv 文件导入数组。我确实意识到它不是最适合语言的,而且我实际上不确定数组是最好的结构,但无论如何......
它工作正常,但我对自己的做法感到非常不安。
let import file_name separator =
let reg_separator = Str.regexp separator in
let value_array = Array.make_matrix 1600 12 0. in
let i = ref 0 in
try
let ic = open_in file_name in
(* Skip the first line, columns headers *)
let _ = input_line ic in
try
while true; do
(* Create a list of values from a line *)
let line_list = Str.split reg_separator (input_line ic) in
for j = 0 to ((List.length line_list) - 1) do
value_array.(!i).(j) <- float_of_string (List.nth line_list j)
done;
i := !i + 1
done;
value_array
with
| End_of_file -> close_in ic; value_array
with
| e -> raise e;;
基本上,我逐行读取文件,并沿分隔符拆分每一行。问题是这个 return 是一个列表,因此下一行的复杂性真的很可怕。
value_array.(!i).(j) <- float_of_string (List.nth line_list j)
除了自己重新编码整个拆分的东西之外,还有什么更好的方法吗?
PS : 我已经很长时间没有用 Ocaml 编写代码了,所以我对尝试的事情和我 return 数组的方式很不确定。
干杯。
在 OCaml >=4.00.0
上,您可以使用 List.iteri 函数。
List.iteri
(fun j elem -> value_array.(!i).(j) <- float_of_string elem)
line_list
您可以用这段代码替换您的 for 循环,它应该可以很好地工作(当然,您需要保留 ;
)。
在旧版本的 OCaml 上,您可以将 List.iter 与您手动递增的引用一起使用,或者以更简洁的方式声明您自己的 iteri。
请注意,您的代码不是很安全,尤其是在文件大小方面(例如,行数和列数)。也许您应该将维度参数作为函数参数以增加灵活性。
编辑:对于未来的读者,您可以使用非常简单的 ocaml-csv(通过 OPAM:opam install csv
)
我正在尝试将 OCaml 中的 csv 文件导入数组。我确实意识到它不是最适合语言的,而且我实际上不确定数组是最好的结构,但无论如何...... 它工作正常,但我对自己的做法感到非常不安。
let import file_name separator =
let reg_separator = Str.regexp separator in
let value_array = Array.make_matrix 1600 12 0. in
let i = ref 0 in
try
let ic = open_in file_name in
(* Skip the first line, columns headers *)
let _ = input_line ic in
try
while true; do
(* Create a list of values from a line *)
let line_list = Str.split reg_separator (input_line ic) in
for j = 0 to ((List.length line_list) - 1) do
value_array.(!i).(j) <- float_of_string (List.nth line_list j)
done;
i := !i + 1
done;
value_array
with
| End_of_file -> close_in ic; value_array
with
| e -> raise e;;
基本上,我逐行读取文件,并沿分隔符拆分每一行。问题是这个 return 是一个列表,因此下一行的复杂性真的很可怕。
value_array.(!i).(j) <- float_of_string (List.nth line_list j)
除了自己重新编码整个拆分的东西之外,还有什么更好的方法吗?
PS : 我已经很长时间没有用 Ocaml 编写代码了,所以我对尝试的事情和我 return 数组的方式很不确定。
干杯。
在 OCaml >=4.00.0
上,您可以使用 List.iteri 函数。
List.iteri
(fun j elem -> value_array.(!i).(j) <- float_of_string elem)
line_list
您可以用这段代码替换您的 for 循环,它应该可以很好地工作(当然,您需要保留 ;
)。
在旧版本的 OCaml 上,您可以将 List.iter 与您手动递增的引用一起使用,或者以更简洁的方式声明您自己的 iteri。
请注意,您的代码不是很安全,尤其是在文件大小方面(例如,行数和列数)。也许您应该将维度参数作为函数参数以增加灵活性。
编辑:对于未来的读者,您可以使用非常简单的 ocaml-csv(通过 OPAM:opam install csv
)