2012-11-20 30 views
5

मैं इस प्रकार एफ # में कुछ ग्राहक डेटा के लिए एक रिकॉर्ड प्रकार परिभाषित किया है: -सशर्त योग

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

पंक्तियों जहां तिथि, डॉ, समूह और उत्पाद सभी बराबर हैं के लिए, मैं तो योग करना चाहते हैं एक बुक की गई पंक्ति का उत्पादन, सभी पुस्तक और राजस्व प्रविष्टियां। तो अगर किसी और तरह का बयान ठीक होना चाहिए। मुझे संदेह है कि मुझे पहले डेटा बिंदु पर शुरू करने की आवश्यकता है और प्रत्येक मिलान पंक्ति को दोबारा जोड़ना है और फिर आउटपुट में डुप्लीकेट से बचने के लिए मिलान पंक्ति को हटा दें।

एक बार मैंने ऐसा करने के बाद मैं इन पिवोटेड पंक्तियों को किसी अन्य सीएसवी फ़ाइल में आसानी से लिखने में सक्षम हो जाऊंगा।

क्या कोई मुझे शुरू कर सकता है?

उत्तर

7

Seq.groupBy और Seq.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; })) 
+0

बढ़िया है, यह है बहुत साफ़। अगर यह काम करता है तो परीक्षण और स्वीकार करेगा। –

+0

इसके अलावा, उन कार्यों को इंगित करने के लिए धन्यवाद जो मुझे स्वयं को परिचित करने की आवश्यकता है। –

+0

आपका स्वागत है :-)। – pad

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

फिर से बहुत साफ और बहुत अच्छी तरह से। मैं इन दोनों का परीक्षण करूंगा। –

संबंधित मुद्दे