5

我刚开始玩 F#,所以这个问题可能很基础......

我想逐行读取文本文件,然后忽略第一行并使用给定函数处理其他行。所以我正在考虑使用类似的东西:

File.ReadAllLines(path)
|> Array.(ignore first element)
|> Array.map processLine

什么是完成它的优雅而有效的方法?

4

3 回答 3

10

没有简单的函数可以跳过数组中的第一行,因为该操作效率不高(它必须复制整个数组),但是如果您使用惰性序列代替,您可以轻松地做到这一点:

File.ReadAllLines(path) 
|> Seq.skip 1
|> Seq.map processLine

如果您需要数组中的结果(而不是seq<'T>,它是 的 F# 别名IEnumerable<'T>),那么您可以添加Seq.toArray到末尾。但是,如果您以后只想遍历这些行,那么您可能只使用序列。

于 2012-06-06T14:50:31.220 回答
2

这是对托马斯回答的补充,我普遍同意。需要注意的一件事是,如果您的数组或序列不包含行会发生什么。(或者比您想跳过的行数更少。)在这种情况下, Seq.skip 将引发异常。我能想到的最简洁的方法是:

System.IO.File.ReadAllLines fileName
|> Seq.mapi (fun i elem -> i, elem)
|> Seq.choose (fun (i, elem) -> if i > 0 then Some(elem) else None)
于 2012-06-07T12:34:09.377 回答
1

您只需通过 . 跳过 F# 数组中的第一个元素myArray.[1..]。一定会喜欢这种语言的优雅。

于 2016-12-06T20:18:15.597 回答