如何快速迭代文件生成列表

时间:2013-11-29 12:29:43

标签: list f#

我来自c#和python背景,觉得必须有更好的方法来读取文件并填充经典的F#列表。但后来我知道f#list是不可变的。必须有一个使用List<string>对象并调用其Add方法的替代方法。

到目前为止,我手头有了:

let ptr = new StreamReader("stop-words.txt")
let lst = new List<string>()
let ProcessLine line =
    match line with
    | null -> false
    | s -> 
        lst.Add(s)
        true
while ProcessLine (ptr.ReadLine()) do ()   

如果我在python中编写类似的东西,我会做类似的事情:

[x[:-1] for x in open('stop-words.txt')]

2 个答案:

答案 0 :(得分:2)

如果要阅读文件中的所有行,可以使用ReadAllLines。该方法将数据作为数组返回,但您可以使用List.ofArray轻松将其转换为F#列表,或使用Seq模块中的函数处理它:

open System.IO

File.ReadAllLines("stop-words.txt")

或者,如果您不想将所有内容都读入内存,则可以使用File.ReadLines来懒散地读取这些行。

答案 1 :(得分:2)

简单的解决方案

    System.IO.File.ReadAllLines(filename) |> List.ofArray

虽然你可以写一个递归函数

let processline fname =
    let file = new System.IO.StreamReader("stop-words.txt")
    let rec dowork() =
        match file.ReadLine() with
        |null -> []
        |t -> t::(dowork())
    dowork()