2017-02-28 102 views
3

我是一个初学者,开始使用FSharp.Data库 http://fsharp.github.io/FSharp.Data/library/CsvProvider.htmlF#CSV类型提供程序:如何忽略一些行?

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文件.. ..“

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

+2

我不认为CsvProvider末跳过行,但你可以随时使用'rows.Take(X)',或应用过滤器,以获取必要的数据。还有三点意见:1.您可能想尝试使用[Csv Type Provider](http://fsharp.github.io/FSharp.Data/library/CsvProvider.html)来正确输入列,2.它有一个'IgnoreErrors = true'选项将跳过不符合的行,3.如果装饰了F#记录,则可能需要尝试具有IgnoreFirst和IgnoreLast选项的[FileHelpers](http://www.filehelpers.net/)与'[]'Filehelpers工作得很好。 – s952163

+2

CSV提供程序或解析器(您正在使用的)都不能跳过最后一行。尝试设置'ignoreErrors'参数来忽略最后一行。 –

回答

0

CsvFile.Load有一个过载,需要TextReader衍生参数。

如果您知道需要跳过多少行,则可以在该文件上创建一个StreamReader,您可以跳过ReadLine的行。

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

这只会跳过第一行,为此CsvFile已经有一个选项“skipRows”。 – s952163

+1

只读文本阅读器不能跳过页脚行,因为它无法知道剩下多少行 –

+2

糟糕。应该更好地阅读这个问题。是的,你需要一个自定义阅读器,预读并在空行之前标记结尾,或者将所有行读入数组,将最后一行切掉,然后将它们一起放入一个StringReader实例的字符串中。 – marklam

0

如果你确定有加载整个SCV到内存中,那么你可以简单地恢复你的行,跳过你想要什么,然后(可选)转回。

例子:

相关问题