【问题标题】:F# reading and separating text from a fileF# 从文件中读取和分离文本
【发布时间】:2014-01-15 21:23:35
【问题描述】:

例如,我有一个带有数字和逗号分隔行的 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# 还很陌生,在这里找不到正确的语法和/或执行此操作的方法,我们将不胜感激。

【问题讨论】:

  • 谢谢,一定会看看的。

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


【解决方案1】:

您可以首先尝试确定 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"|]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多