2017-02-28 45 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到內存中,那麼你可以簡單地恢復你的行,跳過你想要什麼,然後(可選)轉回。

例子:

相關問題