2011-11-18 7 views
5

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

तो मेरे सवाल सिर्फ पागल बात कर और यह आसान होगा सब कुछ का प्रतिनिधित्व करने के एक सूची है करने के लिए आप

createRecordClass (x:xs) = data Record {addRecord(x:xs)} 
addRecord (x:xs) = x::String, addRecord xs 

की तरह कुछ कर सकते हैं या मैं कर रहा हूँ कर सकते हैं?

+0

आप पागल –

+1

बात कर रहे हैं मैं आपकी समस्या से परिचित नहीं हूं, और यह निर्भर हो सकता है ... लेकिन मैं उन सीएसवी फाइलों पर आप जो ऑपरेशन कर सकता हूं, मॉडलिंग करने का सुझाव दूंगा, बजाय गुना करने की कोशिश करने के बजाय उन्हें कार्यक्रम में। एक बार आपके पास "जादू" डेटा प्रकार हो जो आपके सीएसवी फाइलों के अनुरूप होता है, तो आपके पास "जादू" कार्य होते हैं जो उनके ऊपर सार होते हैं। यदि आपका प्रकार जादू नहीं है, तो आपके कार्यों को होने की आवश्यकता नहीं है। – luqui

+2

इन CSV फ़ाइलों के साथ आप क्या करते हैं? वे क्या डेटाटाइप शामिल कर सकते हैं? आपको यहां कितनी प्रकार की सुरक्षा की आवश्यकता है? – hugomg

उत्तर

1

आप जो चाहते हैं उसे प्राप्त करने के लिए आप Template Haskell का उपयोग कर सकते हैं। यह हास्केल के माध्यम से हास्केल कोड उत्पन्न करने के लिए एक शक्तिशाली तकनीक है (लिस्प में मैक्रोज़ के इरादे के समान)।

चूंकि आपने बताया है कि आप कस्टम डेटा प्रकार बनाने के लिए सीएसवी फ़ाइल के शीर्षलेख को चाहते हैं, तो आपको फ़ाइल में पढ़ना होगा और फिर टेम्पलेट हास्केल में डेटा प्रकार जेनरेट करना होगा। मैंने जो समाधान देखा है, उसके करीब आने वाला एक समाधान सीआरयूडी प्रणाली Yesod में है। Hackage पर उनके Persistent पैकेज देखें।

0

यदि आपके पास संकलन समय पर सीएसवी फ़ाइल प्रकारों का सीमित सेट है तो आप टेम्पलेट हैकेल के साथ कुछ लिख सकते हैं। उदाहरण के लिए यदि आप csv फ़ाइल के 2 प्रकार था: एक प्रवेश csv फ़ाइल और एक विकल्प csv फ़ाइल, और आपको निम्न दो नमूना फ़ाइलों था:

//sample_logger.csv 
Date,Action,Succeeded 
20110808,print log,true 
20110929,save db,false 

// sample_options.csv 
Option,Value 
backgroundColor,green 
name,Fred 

तो फिर तुम एक टेम्पलेट Haskell समारोह है कि के पहले लाइनों को पढ़ लिख सकता है उन फ़ाइलों और OptionsCSVLine और LoggerCSVLine डेटाटाइप, readOptionsCVS :: FilePath -> IO [OptionsCSVLine] और readLoggerCSV :: FilePath -> IO [LoggerCSVLine] फ़ंक्शंस के साथ बनाया। उदाहरण के लिए:

-- CSVReader.hs 
makeCSVReader :: String -> FilePath -> Q [Dec] 
makeCSVReader dataTypeName sampleFilePath = sequence [makeDataType,makeReaderFunc] where 
    makeDataType = undefined -- todo 
    makeReaderFunc = undefined -- todo 


-- main.hs 
import CSVReader 
makeCVSReader "OptionsCSV" "sample_options.csv" 
makeCVSReader "LoggerCSV" "sample_logger.csv" 

main = do 
logLines <- readLoggerCSV "some_logger_file.csv" 
print $ map loggerLineDate logLines -- print all the dates in the log file 

हालांकि, अगर आप किसी भी सीएसवी रन टाइम पर आपूर्ति की फ़ाइल से निपटने के लिए चाहते हैं, तो यह संभव नहीं किसी भी तरह से है।

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

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