2016-03-08 8 views
5

यह प्रश्न किसी ऐसे व्यक्ति से आ रहा है जो आर से एफ # में संक्रमण करने पर काम कर रहा है। मैं पूरी तरह से स्वीकार करता हूं कि यहां मेरा दृष्टिकोण गलत हो सकता है इसलिए मैं इसे करने का एफ # तरीका ढूंढ रहा हूं। मेरे पास एक ऐसी स्थिति है जहां मैं एक्सएमएल फाइलों के एक सेट के माध्यम से पुनरावृत्ति करना चाहता हूं, उन्हें पार्स कर सकता हूं, और यह पहचानने के लिए कई मूल्यों को निकालने के लिए कि किसके लिए आगे की प्रक्रिया की आवश्यकता है। मेरा प्राकृतिक झुकाव इस मामले में एक्सएमएल डेटा, exampleData की सरणी पर मानचित्र करना है, RawDataProvider प्रकार प्रदाता का उपयोग करके प्रत्येक को पार्स करें, और आखिरकार पार्स किए गए एक्सएमएल, एक्सएमएल से स्टेटस वैल्यू, और आइटम आईडी सहित प्रत्येक फाइल के लिए मैप ऑब्जेक्ट बनाएं मूल्य।एफ # संग्रह प्रकार

यह पता चला है कि एफ # में मानचित्र प्रकार आर में सूची की तरह नहीं है आर में अनिवार्य रूप से हैशैप्स हैं जो मिश्रित प्रकारों का समर्थन कर सकते हैं। ऐसा प्रतीत होता है कि एफ # में मानचित्र प्रकार मिश्रित प्रकारों को संग्रहित करने का समर्थन नहीं करता है। मैंने इसे अपने आर काम में अविश्वसनीय रूप से उपयोगी पाया है और इसके लिए यह देख रहा हूं कि सही F # संग्रह इसके लिए क्या है।

या, क्या मैं इस सब गलत के बारे में सोच रहा हूं? आर में डेटा संसाधित करने के लिए यह एक बहुत ही स्वाभाविक तरीका है इसलिए मैं उम्मीद करता हूं कि एफ # में भी ऐसा करने का एक तरीका होगा। धारणा यह है कि मैं आगे के विश्लेषण करने जा रहा हूं और इन संग्रहों में डेटा के अतिरिक्त तत्व जोड़ रहा हूं।

अद्यतन: यह इस तरह के एक सरल उपयोग के मामले कि वहाँ विश्लेषण के प्रत्येक चरण के लिए एक रिकॉर्ड प्रकार को परिभाषित करने के बिना एफ # में ऐसा करने का एक मुहावरेदार तरीका होना चाहिए की तरह लगता है। मैंने यह उदाहरण आगे बढ़ाने के लिए अपना उदाहरण अपडेट किया है कि मैं क्या करने की कोशिश कर रहा हूं। मैं मानचित्र वस्तुओं है कि मैं का विश्लेषण किया है की एक सरणी वापस जाने के लिए चाहते हैं:

type RawDataProvider = XmlProvider<"""<product Status="Good" ItemId="123" />""">   

let exampleData = [| """<product Status="Good" ItemId="123" />"""; """<product Status="Bad" ItemId="456" />"""; """<product Status="Good" ItemId="789" />"""|] 

let dataResult = 
      exampleData 
      |> Array.map(fun fileData -> RawDataProvider.Parse(fileData)) 
      |> Array.map(fun xml -> Map.empty.Add("xml", xml).Add("Status", xml.Status).Add("ItemId", xml.ItemId)) 
      |> Array.map(fun elem -> elem.["calc1Value"] = calc1 elem["itemId"]) 
      |> Array.map(fun elem -> elem.["calc2"] = calc2 elem.["ItemId"] elem.["calc1Value"]) 
+0

आपने जो नहीं पूछा, लेकिन मुझे लगता है कि 'File.ReadAllLines (फ़ाइल) |> Array.reduce (+) 'को' File.ReadAllText (फ़ाइल) ' – CoderDennis

+0

@CoderDennis के साथ प्रतिस्थापित किया जा सकता है –

+0

जानकारी के लिए धन्यवाद ढीले टाइप किए गए हैश के बजाय एक रिकॉर्ड प्रकार का उपयोग करें। –

उत्तर

4

यह वही मैं यहाँ लगभग मुहावरेदार पर विचार करेगा है - मैं के रूप में ही आकार रखने कर रहा हूँ अपने उदाहरण में तो आप दो से मेल कर सकते हैं:

let dataResult = 
    exampleData 
    |> Array.map(fun fileData -> RawDataProvider.Parse(fileData)) 
    |> Array.map(fun xml -> xml, calc1 xml.ItemId) 
    |> Array.map(fun (xml, calcedValue1) -> xml, calcedValue1, calc2 xml.ItemId calcedValue1) 

क्या XmlProvider वास्तव में आप देता है बस नहीं XML पार्सिंग, लेकिन तथ्य यह है कि यह xml का दृढ़ता से टाइप किया प्रतिनिधित्व उत्पन्न करता है। यह डेटा को मानचित्र में डालने से बेहतर है, जिसमें यह आपको मजबूत गारंटी देता है कि आपका प्रोग्राम सही काम कर रहा है या नहीं। उदाहरण के लिए यह आपको itemId और ItemId को आपके कोड स्निपेट में होने जैसा नहीं देगा;)

उन मानों के लिए जिन्हें आप निम्न चरणों में गणना करते हैं, आप रिकॉर्ड के बजाय tuples का उपयोग कर सकते हैं। आम तौर पर, रिकॉर्ड को ट्यूपल्स के लिए प्राथमिकता दी जाती है क्योंकि वे अधिक पठनीय कोड का नेतृत्व करते हैं, लेकिन विभिन्न प्रकार के संबंधित मूल्यों को विज्ञापन-प्रसार समेकन में जोड़ना वास्तव में परिदृश्य है जहां टुपल्स चमकते हैं।

अब, मैं ने कहा लगभग मुहावरेदार - मैं अलग कार्यों में पार्स करने और प्रसंस्करण पार्स xmls को तोड़ने होता है, और बजाय एक ही समारोह में दोनों calc1 और calc2 परिणामों की गणना दो Array.maps इस तरह रचना की:

let dataResult = 
    parsedData 
    |> Array.map(fun xml -> 
     let calced1 = calc1 xml.ItemId 
     xml, calced1, calc2 xml.ItemId calced1) 

यदि आप आर पृष्ठभूमि से आ रहे हैं, तो आप वैकल्पिक दृष्टिकोण के लिए Deedle देख सकते हैं। यह आपको एफ # में आर के समान वर्कफ़्लो देता है।

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