【问题标题】:OCaml - Read csv file into arrayOCaml - 将 csv 文件读入数组
【发布时间】:2015-02-26 09:09:03
【问题描述】:

我正在尝试将 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;;

基本上,我逐行读取文件,并沿分隔符拆分每一行。问题是这会返回一个列表,因此下一行的复杂性真的很可怕。
value_array.(!i).(j) &lt;- float_of_string (List.nth line_list j)
除了我自己重新编码整个拆分的东西之外,还有什么方法可以更好地做到这一点?

PS : 好久没用 Ocaml 写代码了,所以对尝试的东西和返回数组的方式都不太确定。

干杯。

【问题讨论】:

    标签: arrays csv ocaml


    【解决方案1】:

    在 OCaml &gt;=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

    【讨论】:

    • 是的,我知道参数,但这只是一次性(嗯,2)使用,所以这并不重要。无论如何都会这样做,非常感谢。
    猜你喜欢
    • 2011-05-16
    • 2019-08-24
    • 2013-12-11
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2013-12-16
    • 2014-12-12
    相关资源
    最近更新 更多