2012-11-20 22 views
5

tôi đã xác định một loại kỷ lục đối với một số dữ liệu khách hàng trong F # như sau: -tổng có điều kiện trong 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 
       |> ?????????? 

Đối với các hàng nơi ngày, dr, Group và sản phẩm đều bình đẳng, tôi muốn sau đó tổng hợp tất cả các mục trong Sách và Doanh thu, tạo ra một hàng được xoay vòng. Vì vậy, một số loại nếu tuyên bố khác nên được tốt. Tôi nghi ngờ tôi cần phải bắt đầu tại điểm dữ liệu đầu tiên và đệ quy thêm mỗi hàng phù hợp và sau đó xóa hàng phù hợp để tránh trùng lặp trong đầu ra.

Khi tôi đã thực hiện việc này, tôi sẽ có thể dễ dàng viết các hàng được chia nhỏ này sang một tệp csv khác.

Có ai có thể giúp tôi bắt đầu không?

Trả lời

7

Seq.groupBySeq.reduce là những gì bạn đang tìm kiếm:

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; })) 
+0

Tuyệt vời, đây là rât gọn gang. Sẽ kiểm tra và chấp nhận nếu nó hoạt động. –

+0

Ngoài ra, cảm ơn bạn đã chỉ ra các chức năng tôi cần để làm quen với. –

+0

Bạn được chào đón :-). – pad

3

Nhanh chóng hack lên, nên cung cấp cho bạn một số ý tưởng:

// 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 

in

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 
+0

Một lần nữa rất gọn gàng và rất kỹ lưỡng. Tôi sẽ kiểm tra cả hai. –