मैं सीखने के उद्देश्य के लिए क्लोजर में थोड़ा पार्सर लिख रहा हूं। मूल रूप से एक टीएसवी फ़ाइल पार्सर है जिसे डेटाबेस में डालने की आवश्यकता है, लेकिन मैंने एक जटिलता जोड़ा। जटिलता स्वयं ही है कि एक ही फ़ाइल में अधिक अंतराल होते हैं। इस तरह फ़ाइल देखो:क्लोजर के साथ डेटा पार्सिंग, अंतराल समस्या
(defn is-header?
"Return true if a line is header"
[line]
(> (count (re-find #"^\#{3}" line)) 0))
(defn extract-fields
"Return regex matches"
[line pattern]
(rest (re-find pattern line)))
(defn process-lines
[lines]
(map process-line lines))
(defn process-line
[line]
(if (is-header? line)
(extract-fields line header-pattern))
(extract-fields line data-pattern))
मेरा विचार है कि इसलिए मैं की तरह कुछ है में 'प्रक्रिया ऑनलाइन' अंतराल डेटा के साथ मर्ज करने की आवश्यकता है:
###andreadipersio 2010-03-19 16:10:00###
USER COMM PID PPID %CPU %MEM TIME
root launchd 1 0 0.0 0.0 2:46.97
root DirectoryService 11 1 0.0 0.2 0:34.59
root notifyd 12 1 0.0 0.0 0:20.83
root diskarbitrationd 13 1 0.0 0.0 0:02.84`
....
###andreadipersio 2010-03-19 16:20:00###
USER COMM PID PPID %CPU %MEM TIME
root launchd 1 0 0.0 0.0 2:46.97
root DirectoryService 11 1 0.0 0.2 0:34.59
root notifyd 12 1 0.0 0.0 0:20.83
root diskarbitrationd 13 1 0.0 0.0 0:02.84
मैं इस कोड के साथ समाप्त हो गया इस:
('andreadipersio', '2010-03-19', '16:10:00', 'root', 'launchd', 1, 0, 0.0, 0.0, '2:46.97')
अगले अंतराल तक हर पंक्ति के लिए
, लेकिन मैं समझ नहीं सकता कि यह कैसे ऐसा करने के लिए।
मैं कुछ इस तरह से करने की कोशिश की:
(def process-line
[line]
(if is-header? line)
(def header-data (extract-fields line header-pattern)))
(cons header-data (extract-fields line data-pattern)))
लेकिन जैसे अपवादित यह काम नहीं करता।
कोई संकेत?
धन्यवाद!
बीटीडब्लू, शीर्ष स्तर को छोड़कर 'def' का उपयोग न करें जबतक कि आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं! और निश्चित रूप से इसे म्यूटेबल स्टोरेज के लिए कभी भी इस्तेमाल न करें। इसके बजाय एक रेफ या एटम का प्रयोग करें। –
धन्यवाद, यह एक अनमोल संकेत है! –
मुझे उम्मीद है कि आप rubylearning.org (क्लोजर 101 कोर्स के लिए) पर एक अभ्यास के लिए आधार बनने के लिए ठीक हैं? मुझे लगता है कि काम करने के लिए यह एक बहुत अच्छी समस्या है। –