F#从文件中读取和分离文本

时间:2013-12-28 13:18:52

标签: c# f# c#-to-f# guard-clause

我有一个txt文件,其中包含数字和逗号分隔的行,例如。

4324,1dd3,444

4324,1fd3,444

4324,1as3,442

我有一个函数,它接受一个字符串作为参数,我想检查每一行,如果该字符串等于该行的第二个“字”,那么第一行将是“1dd3”。 如果该参数匹配单词我想将行的第三个单词添加到字符串列表中(或者稍后将其保存以便在代码中使用它)。

在C#中,我只需遍历列表并在逗号上使用分割,就像这样

while(reader.Peek > 0) //while txt file still has lines left to read
{
    split the row...
    compare it to argument
    add to list of strings
}

但我对F#相当新,并且无法在此处找到正确的语法或方法,任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:13)

您可以首先尝试确定1)要运行的相应数据结构,以及2)是否已经预定义的库函数已经完成了所需的操作。在这种情况下,我不会浪费时间逐行读取文件,而是立即读取所有文件。所以它是一个运行的阵列。

该函数需要对数组的所有元素应用选择器,例如滤镜和投影的组合。因此,如果您只对第一次出现感兴趣,则为Array.pick/Array.tryPick,或者Array.choose来检索您的谓词为真的所有实例。现在我们所做的就是使用保护条款进行模式匹配,以检查您的情况。

let findTextInFile nameOfFile txtToSearch =
    System.IO.File.ReadAllLines nameOfFile
    |> Array.choose (fun s ->
        match s.Split ',' with
        | [| _; y; z |] when y = txtToSearch -> Some z
        | _ -> None )

findTextInFile @"c:\temp\xxx" "1dd3"
// val it : string [] = [|"444"|]