F#读取固定宽度文本文件

Chi*_*ico 5 f# fixed-width

嗨,我希望找到使用F#读取固定宽度文本文件的最佳方法.该文件将是纯文本,从一行到几千行,宽约1000个字符.每行包含大约50个字段,每个字段具有不同的长度.我最初的想法是有类似以下的东西

type MyRecord = {
    Name : string
    Address : string
    Postcode : string
    Tel : string
}

let format = [
    (0,10)
    (10,50)
    (50,7)
    (57,20)
]
Run Code Online (Sandbox Code Playgroud)

并逐个读取每一行,按格式元组分配每个字段(第一项是起始字符,第二项是宽字符数).

任何指针将不胜感激.

Mar*_*ann 4

最难的部分可能是根据列格式分割一行。可以这样做:

let splitLine format (line : string) =
    format |> List.map (fun (index, length) -> line.Substring(index, length))
Run Code Online (Sandbox Code Playgroud)

该函数的类型为(int * int) list -> string -> string list. 换句话说,format是一个(int * int) list. format这与您的列表完全一致。参数line是 a string,函数返回 a string list

您可以像这样映射行列表:

let result = lines |> List.map (splitLine format)
Run Code Online (Sandbox Code Playgroud)

您还可以使用Seq.mapArray.map,具体取决于lines定义方式。这样的 aresult将是 a string list list,现在您可以映射这样的列表来生成 a MyRecord list

您可以使用它File.ReadLines从文件中获取延迟计算的字符串序列。

请注意,以上只是可能解决方案的概述。我省略了边界检查、错误处理等。上面的代码可能包含相差一的错误。