2012-03-19 21 views
4

複数のファイルの内容を含むシーケンスを1つ作成して、ソートしてグラフ化コンポーネントに渡すことを試みています。しかし、私は各ファイルの内容を一緒に折り重ねようとしています。以下の疑似コードはコンパイルされませんが、私が達成しようとしていることの意図が表示されます。F#:一連のシーケンスを1つのSeqにまとめる

ご協力いただきありがとうございます。

open System.IO 

let FileEnumerator filename = seq { 
     use sr = System.IO.File.OpenText(filename) 
      while not sr.EndOfStream do 
      let line = sr.ReadLine() 
      yield line 
} 

let files = Directory.EnumerateFiles(@"D:\test_Data\","*.csv",SearchOption.AllDirectories) 

let res = 
    files 
     |> Seq.fold(fun x item -> 
     let lines = FileEnumerator(item) 
     let sq = Seq.concat x ; lines 
     sq 
    ) seq<string> 

printfn "%A" res 
+4

Seq.collect http://msdn.microsoft.com/en-us/library/ee340468.aspxをお探しですか? –

答えて

12

あなたは、本質的にseq<string>としてファイルの内容を返すFiles.Readlinesを、再実装しようとしています。これは、その後Seq.concatと連結することができます。

let res = Directory.EnumerateFiles(@"D:\test_Data","*.csv",SearchOption.AllDirectories) 
      |> Seq.map File.ReadLines 
      |> Seq.concat 
4

あなたの独創的なアプローチで問題を修正するには、Seq.appendの代わりSeq.concatを使用する必要があります。あなたがSeq.concatを使用したい場合、あなたはconcatは、配列の配列が連結されることを想定しているため、Seq.concat [x; lines]を書く必要があるだろう

let res = 
    files |> Seq.fold(fun x item -> 
     let lines = FileEnumerator(item) 
     let sq = Seq.append x lines 
     sq) Seq.empty 

foldの初期値はSeq.emptyのように書くことができ、空のシーケンス、でなければなりません。一方、appendは2つのシーケンスを取るだけなので、ここでは使いやすくなります。これは、すべてのファイルを反復処理し、(順番に)ファイルからすべての行を追加することにより、シーケンスを作成し

let res = 
    seq { for item in files do 
      yield! FileEnumerator(item) } 

すべての行を連結する別の(単純な)方法は、シーケンス式でyield!を使用することです結果の配列に変換する。 yield!コンストラクトは、結果にシーケンスのすべての要素を追加します。

関連する問題