GHCi

2012-07-18 6 views
5

में Haskell csv-conduit मुझे CSV फ़ाइलों के साथ काम करने के लिए एक अच्छा Haskell पैकेज के रूप में csv-conduit का सुझाव दिया गया है। मैं सीखना चाहता हूं कि यह कैसे काम करता है, लेकिन दस्तावेज़ीकरण एक नौसिखिया हास्केल प्रोग्रामर के लिए बहुत कम है।GHCi

क्या यह पता लगाने का कोई तरीका है कि यह जीएचसीआई में परीक्षण-और-त्रुटि द्वारा कैसे काम करता है?

अधिक विशेष रूप से, मैं लोड करना चाहिए मॉड्यूल और फ़ाइलों से GHCi या मैं उन्हें लोड करने के लिए एक सरल एच एस फ़ाइल लिखना चाहिए और तो कदम सहभागी चारों ओर?


मैं सीएसवी-नाली उल्लेख किया है, लेकिन मैं किसी भी सीएसवी पैकेज का उपयोग करने के लिए खोला रहा हूँ। मुझे बस एक पर अपना हाथ लेने की ज़रूरत है और इसके साथ मूर्खतापूर्ण है, जब तक कि मुझे आसानी से महसूस न हो (जैसा कि मैं आईडीएल में करता हूं)।

उत्तर

2

क्या आपने Text.CSV को आजमाया है? यदि आप अभी हास्केल से शुरुआत कर रहे हैं, तो यह अधिक उपयुक्त हो सकता है, क्योंकि यह बहुत आसान है। नए मॉड्यूल की खोज के लिए, आप इसे केवल जीएचसीआई में लोड कर सकते हैं, अतिरिक्त फ़ाइल लिखने की कोई आवश्यकता नहीं है। "file.csv" या कुछ और के रूप में हम सिर्फ एक CSVSettings, इस तरह के defCSVSettings के रूप में की जरूरत है readCSVFile :: :: (MonadResource m, CSV ByteString a) => CSVSettings -> FilePath -> m [a]

इसके अपेक्षाकृत सरल कॉल करने के लिए, और एक FilePath (उर्फ String),:

5

निम्नलिखित समारोह पर एक नजर डालें।

इस प्रकार, कॉल के बाद, हमें (MonadResource m, CSV ByteString a) मिलता है। हम इस समय एक उचित प्रकार का पता लगाने के लिए इसे हल कर सकते हैं। हम इस ऑपरेशन में IO प्रदर्शन कर रहे हैं, इसलिए MonadResource m, m के लिए केवल ResourceT IO होना चाहिए, जो के अनुसार MonadBaseControl IO का उदाहरण होना चाहिए। यह conduit विशिष्ट चीज़ है।

CSV ByteString a के लिए, हमें CSV के उदाहरणों को खोजने की आवश्यकता है। ऐसा करने के लिए, http://hackage.haskell.org/packages/archive/csv-conduit/0.2.1.1/doc/html/Data-CSV-Conduit.html#t:CSV पर जाएं (जहां पैकेज के लिए प्रलेखन मेरी राय में कुछ हद तक अपमानजनक रूप से टाइपक्लास में भरा हुआ है ...) और उदाहरणों पर क्लिक करें कि हमारे पास CSV ByteString a फ़ॉर्म के उपलब्ध उदाहरण क्या हैं। दो विकल्प CSV ByteString ByteString और CSV ByteString Text हैं।

इनमें से दो में से Text बेहतर है क्योंकि यह यूनिकोड को नियंत्रित करता है और सीएसवी बाइनरी डेटा युक्त होने की संभावना नहीं है। ByteString[Word8] के समान या कम है जबकि Text[Char] के समान है जो शायद आप चाहते हैं। इसलिए, aText होना चाहिए (हालांकि ByteString अभी भी काम करेगा)।

इसका मतलब है कि फ़ंक्शन कॉल का परिणाम ResourceT IO [Row Text] है। हम इसके साथ बहुत कुछ नहीं कर सकते हैं, लेकिन ResourceT एक मोनड ट्रांसफार्मर है, हम आसानी से मोनैड ट्रांसफ़ॉर्मेशन परत को runResourceT के साथ "पॉप" कर सकते हैं। इस प्रकार,

readFile :: FilePath -> IO [Row Text] 
readFile = runResourceT . readCSVFile defCSVSettings 

जो घेरे में मौजूद मुख्य आसानी से प्रयोग करने योग्य [Row Text] पर प्राप्त करने के लिए जो आप तो अलग-अलग पंक्तियों पर अपने हाथों को पाने के लिए एक map या एक fold साथ अधिक पुनरावृति कर सकते हैं।

जीएचसीआई में इस तरह की चीज चलाने के लिए आपको बिल्कुल विशेष रूप से प्रकार को इंगित करना होगा। कारण यह है कि परिणाम वर्ग उदाहरण किसी भी पैरामीटर पर निर्भर नहीं है; इस प्रकार, CSVSettings और FilePath के किसी सेट के लिए, readCSVFile विभिन्न प्रकार के किसी भी संख्या के रूप में लंबे mMonadResource m और a का एक उदाहरण CSV ByteString a का एक उदाहरण है के रूप में वे के रूप में लौट सकते हैं। इस प्रकार, हमें स्पष्ट रूप से जीएचसीआई को इंगित करना होगा जो आप चाहते हैं।

0

यह सीएसवी-कंड्यूट पैकेज (संस्करण 0.6.3) के नवीनतम संस्करण के साथ काम करता है। ReadCsv के हस्ताक्षर पर ध्यान दें जिसके बिना मैं संकलित नहीं कर सका।

{-# LANGUAGE OverloadedStrings #-} 

import Data.CSV.Conduit 
import Data.Text (Text) 
import qualified Data.Vector as V 
import qualified Data.ByteString as B 

csvset :: Char -> CSVSettings 
csvset c = CSVSettings {csvSep = c, csvQuoteChar = Just '"'} 

readCsv :: String -> Char -> IO (V.Vector (Row Text)) 
readCsv fp del = readCSVFile (csvset del) fp 

main = readCsv "C:\\mydir\\myfile.csv" ';' 
साथ पैकेज सीएसवी-नाली-0.6.6 readCsv हस्ताक्षर
+0

होना चाहिए 'readCsv :: स्ट्रिंग -> चार -> आईओ (V.Vector (पंक्ति B.ByteString))', पंक्ति बी के साथ की जगह पंक्ति पाठ ByteString – Janthelme