2009-08-18 15 views
6

मैं अपने डेटा को एक फ़ाइल में जारी रखना चाहता हूं और जब मैं प्रोग्राम को पुन: चालू करता हूं तो डेटा को पुनर्स्थापित करना चाहता हूं।मैं अपने डिफस्ट्रक्ट को फ़ाइल में कैसे जारी रखूं और पुनर्स्थापित कैसे करूं?

मैं जैसे मेरी defstruct परिभाषित किया है:

(defstruct बुकमार्क: यूआरएल: शीर्षक: टिप्पणियाँ)

कार्यक्रम बस निम्न करेगा:
1. लोड defstruct यूआरएल-db से की। txt
2. * कमांड-लाइन-तर्क * में पारित एक आयात फ़ाइल से पढ़ें और आंतरिक डेटा var में जोड़ें।
3. url-db.txt फ़ाइल को फिर से लिखें।

नमूना आयात फ़ाइल:

www.cnn.com | समाचार | यह सीएनएन
है www.msnbc.com | खोजें |
news.ycombinator.com | समाचार | तकनीकी समाचार

+0

कोई मेरे सामने इस समस्या से गुजर गया: http://stackoverflow.com/questions/923029/clojure-slurping-structs-from-file-fails-with-string-attributes-containing-white –

उत्तर

8

टॉम Crayford के जवाब करीब है, लेकिन इसके बजाय "जनसंपर्क" फ़ंक्शन का उपयोग करें "प्रिंट" का। "पीआर" स्ट्रिंग का उत्पादन करता है जिसे "पढ़ा" के साथ वापस पढ़ा जा सकता है।

(defn save-db [db filename] 
    (spit 
    filename 
    (with-out-str (pr db)))) 

(defn load-db [filename] 
    (with-in-str (slurp filename) 
    (read))) 

ध्यान दें कि अगर प्रिंट-डुप्लिक * सत्य पर सेट किया गया है तो यह काम नहीं करेगा। ticket #176 देखें ध्यान दें कि जब आप डेटाबेस को वापस पढ़ते हैं, तो रिकॉर्ड सामान्य मानचित्र होंगे, न कि संरचना मानचित्र। स्ट्रक्चर मैप्स को अभी तक पीआर/रीड के साथ क्रमबद्ध नहीं किया जा सकता है।

+0

बस अपने स्वयं के संपादन के लिए , क्या रीड-स्ट्रिंग और पीआर-स्ट्र का उपयोग करने के बजाय आपने इन-स्ट्र-एंड-आउट-स्ट्र के साथ उपयोग किया है? – alanlcode

+0

वास्तव में नहीं। याद रखें कि मैंने इसे इस तरह क्यों लिखा था। –

+0

एक संरचना मानचित्र के बजाय इसे सामान्य मानचित्र के रूप में कब पढ़ा जाएगा एक समस्या है? मुझे ऐसी जगह का सामना नहीं हुआ है जहां वे अंतर-परिवर्तनीय नहीं थे। इस मामले में, यद्यपि (जैसा कि आपको चाहिए) सामान्य करें, आप प्रत्येक रिकॉर्ड को रिक्त बुकमार्क में विलय कर सकते हैं जैसे आप पढ़ते हैं। –

2

उपयोग थूक और slurp (उदाहरण के http://www.nofluffjuststuff.com/blog/stuart_halloway/2008/09/pcl__clojure_chapter_3_1 से लिया गया)। आम तौर पर इस तकनीक को धारावाहिक कहा जाता है।

(defn save-db [db filename] 
    (spit 
    filename 
    (with-out-str (pr db)))) 

(defn load-db [filename] 
    (with-in-str (slurp filename) 
    (read))) 

(पहले प्रिंट त्रुटि मूल कोड में वहाँ था, और मैं गूंगा था और यह। धन्यवाद जांच नहीं की)

+0

(def x (struct बुकमार्क "news.ycombinator.com" "समाचार" "टेक समाचार")); "उद्धरण में चीजें" संभाल नहीं है –

+0

उनके उदाहरण उद्धरणों में एक नाम था। जब मैंने डेटा को पुनः लोड करने का प्रयास किया तो यह काम नहीं करता (save-db x "url-db.txt") ... (def y (load-db "url-db.txt")) –

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