5

F# で一部のクライアント データのレコード タイプを次のように定義しました。

  type DataPoint = {
       date: string; 
       dr: string; 
       Group: string; 
       Product: string; 
       Book: int; 
       Revenue: int} with 
          static member fromFile file =
               file
               |> File.ReadLines
               |> Seq.skip 1 //skip the header
               |> Seq.map (fun s-> s.Split ',') // split each line into array
               |> Seq.map (fun a -> {date = string a.[0]; dr = string a.[1];
                              Group = string a.[2]; Product = string a.[3];
                                Book = int a.[4]; Revenue = int a.[5] });;  

    // creates a record for each line
    let pivot (file) = DataPoint.fromFile file
              |> ??????????

date、dr、Group、Product がすべて等しい行については、Book と Revenue のすべてのエントリを合計して、ピボットされた行を生成します。したがって、ある種の if else ステートメントは問題ないはずです。最初のデータ ポイントから開始し、一致する各行を再帰的に追加してから、一致する行を削除して、出力の重複を避ける必要があると思います。

これが完了すると、これらのピボットされた行を別の csv ファイルに簡単に書き込むことができます。

誰でも始められますか?

4

2 に答える 2

7

Seq.groupBySeq.reduceはあなたが探しているものです:

let pivot file = 
    DataPoint.fromFile file
    |> Seq.groupBy (fun dp -> dp.date, dp.dr, dp.Group, dp.Product)
    |> Seq.map (snd >> Seq.reduce (fun acc dp -> 
                          { date = acc.date; dr = acc.dr; 
                            Group = acc.Group; Product = acc.Product;
                            Book = acc.Book + dp.Book; 
                            Revenue = acc.Revenue + dp.Revenue; }))
于 2012-11-20T13:36:40.710 に答える
3

すぐにハックアップすると、いくつかのアイデアが得られるはずです:

// Sample data
let data = [
             {date    = "2012-01-01"
              dr      = "Test"
              Group   = "A" 
              Product = "B"
              Book    = 123
              Revenue = 123}
             {date   = "2012-01-01"
              dr      = "Test"
              Group   = "A"
              Product = "B"
              Book    = 123
              Revenue = 123}
             {date = "2012-01-01"
              dr = "Test"
              Group = "B" 
              Product = "B"
              Book = 11
              Revenue = 123}]


let grouped = data |> Seq.groupBy(fun d -> (d.date, d.dr, d.Group, d.Product))
                   |> Seq.map (fun (k,v) -> (k, v |> Seq.sumBy (fun v -> v.Book), v |> Seq.sumBy (fun v -> v.Revenue)))

for g,books,revs in grouped do
   printfn "Books %A: %d" g books
   printfn "Revenues %A: %d" g revs

版画

Books ("2012-01-01", "Test", "A", "B"): 246
Revenues ("2012-01-01", "Test", "A", "B"): 246
Books ("2012-01-01", "Test", "B", "B"): 11
Revenues ("2012-01-01", "Test", "B", "B"): 11
于 2012-11-20T13:40:43.223 に答える