【问题标题】:F# CSV Type Provider : how to ignore some rows?F# CSV 类型提供程序:如何忽略某些行?
【发布时间】:2017-07-19 05:34:18
【问题描述】:

我是初学者,开始使用 FSharp.Data 库 http://fsharp.github.io/FSharp.Data/library/CsvProvider.html

let rawfile = CsvFile.Load("mydata.csv")
for row in rawfile.Rows do
       let d = System.DateTime.Parse (row.GetColumn("Date"))
       let p = float (row.GetColumn("Close Price"))
       printfn "%A %A" d p
       price_table.[BTC].Add (d,p)

我有一个 csv 文件,我想忽略它的最后几行,因为 它们类似于“此数据由……生成”

顺便说一句,即使我删除了这些行,保存文件,当我再次重新打开这些单元格时,这些单元格会重新出现......粘性的!!!

标签: csv f# f#-data


【解决方案1】:

CsvFile.Load 有一个重载,它采用 TextReader 派生参数。

如果你知道要跳过多少行,你可以在文件上创建一个StreamReader,你可以用ReadLine跳过行。

use reader = StreamReader("mydata.csv")
reader.ReadLine() |> ignore
reader.ReadLine() |> ignore
let rawfile = CsvFile.Load(reader)

【讨论】:

  • 这只会跳过第一行,CsvFile 已经有一个选项skipRows
  • 只进文本阅读器不能跳过页脚行,因为它不知道还剩多少行
  • 糟糕。应该更好地阅读这个问题。是的,您需要一个自定义阅读器来预读并在空白行之前标记结尾,或者将所有行读入一个数组,切掉最后几行并将它们重新组合成一个字符串,用于 StringReader 实例。
【解决方案2】:

如果您可以将整个 scv 加载到内存中,那么您可以简单地反转您的行,跳过您想要的内容,然后(可选)反转回来。

例子:

let skipNLastValues (n:int) (xs:seq<'a>) =
    xs
    |> Seq.rev
    |> Seq.skip n
    |> Seq.rev

for i in (skipNLastValues 2 {1..10}) do
    printfn "%A" i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2012-07-28
    相关资源
    最近更新 更多