2017-08-03 12 views
1

一部の言語では、遅延したシーケンスを通過した後、その言語は使い尽くされます。なぜCSVプロバイダの行を2回通過できないのですか?

open FSharp.Data 

[<Literal>] 
let foldr = __SOURCE_DIRECTORY__ + @"\data\" 

[<Literal>] 
let csvPath = foldr + @"AssetInfoFS.csv" 

type AssetsInfo = CsvProvider<Sample=csvPath, 
           HasHeaders=true, 
           ResolutionFolder=csvPath, 
           AssumeMissingValues=false, 
           CacheRows=false> 

let assetInfo = AssetsInfo.Load(csvPath) 
assetInfo.Rows |> Seq.iter (fun x -> printfn "%A" <| x) // Works fine 1st time 
assetInfo.Rows |> Seq.iter (fun x -> printfn "%A" <| x) // 2nd time exception 

なぜそれが起こるん:1は、CSVプロバイダの行を一度しか行くことができるようにしかし、それは見え

let mySeq = seq [1..5] 

mySeq |> Seq.iter (fun x -> printfn "%A" <| x) 
mySeq |> Seq.iter (fun x -> printfn "%A" <| x) 

1 
2 
3 
4 
5 
1 
2 
3 
4 
5 

:それはF#の場合ではありませんか?

答えて

3

CSVパーサーのlinkから、CSVタイププロバイダーはCSVパーサーの上に構築されます。 CSVパーサーはストリーミングモードで動作します。おそらくFile.ReadLinesのようなメソッドを呼び出します。これは、列挙子が2回目に列挙されると例外をスローします。 CSVパーサーにはCacheメソッドもあります。この問題を回避するには、CacheRows = trueを設定するか(デフォルト値がtrueであるため宣言の外に置いてください)

CsvProvider<Sample=csvPath, 
      HasHeaders=true, 
      ResolutionFolder=csvPath, 
      AssumeMissingValues=false, 
      CacheRows=true> 
1

シーケンス反復子は、ポイントする場所に置かれたままです。最初のループの後、それがシーケンスの終わりです。

最初に戻るには、そこに設定する必要があります。

関連する問題