嗨,我希望找到使用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)
并逐个读取每一行,按格式元组分配每个字段(第一项是起始字符,第二项是宽字符数).
任何指针将不胜感激.
最难的部分可能是根据列格式分割一行。可以这样做:
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.map或Array.map,具体取决于lines定义方式。这样的 aresult将是 a string list list,现在您可以映射这样的列表来生成 a MyRecord list。
您可以使用它File.ReadLines从文件中获取延迟计算的字符串序列。
请注意,以上只是可能解决方案的概述。我省略了边界检查、错误处理等。上面的代码可能包含相差一的错误。