2012-11-30 14 views
5

में एक सूची में सीएसवी पढ़ें मुझे पता है कि बहुत से संबंधित प्रश्न हैं, मैंने उन्हें पढ़ा है लेकिन अभी भी पढ़ने-प्रक्रिया-लिखने के बारे में कुछ मौलिक समझ हासिल नहीं की है। जो एक लाइनक्लोजर

(defn take-csv 
    "Takes file name and reads data." 
    [fname] 
    (with-open [file (reader fname)] 
    (doseq [line (line-seq file)] 
     (let [record (parse-csv line)])))) 

मैं प्राप्त करने के लिए चाहते हैं क्या डेटा (def data (take-csv "file.csv")) का एक परिणाम के रूप में कुछ संग्रह में पढ़ सकते हैं और बाद में यह कार्रवाई करने के लिए है पार्स करने के लिए clojure-csv लाइब्रेरी का उपयोग करता है उदाहरण के लिए निम्नलिखित समारोह लो। तो मूल रूप से मेरा सवाल यह है कि मैं record या रिकॉर्ड की एक सूची कैसे वापस कर सकता हूं।

उत्तर

7

"डोसेक" अक्सर साइड इफेक्ट के साथ संचालन के लिए उपयोग किया जाता है। आपके मामले में आप उपयोग कर सकते हैं अभिलेखों का संग्रह बनाने के लिए "मानचित्र":

(defn take-csv 
    "Takes file name and reads data." 
    [fname] 
    (with-open [file (reader fname)] 
    (doall (map (comp first csv/parse-csv) (line-seq file))))) 

बेहतर लोगों पर पूरी फ़ाइल को पार्स कम करने के लिए कोड:

(defn take-csv 
    "Takes file name and reads data." 
    [fname] 
    (with-open [file (reader fname)] 
    (csv/parse-csv (slurp file)))) 

तुम भी बजाय clojure.data.csv उपयोग कर सकते हैं clojure-csv.core का। पिछले कार्य में लेने के लिए केवल parse-csv का नाम बदलना चाहिए।

(defn put-csv [fname table] 
    (with-open [file (writer fname)] 
    (csv/write-csv file table))) 
+0

अच्छा। अब सब बचा है 'put-csv', क्या आप मदद करेंगे? –

+0

मैंने इसे जोड़ा है। – mobyte

+0

डोल पर ध्यान दें: डोल किसी भी प्रभाव को लागू करने के लिए उपयोग किया जा सकता है। सीईसी के लगातार नेक्सट्स के माध्यम से चलता है, सिर को बरकरार रखता है और इसे वापस लौटाता है, इस प्रकार पूरे सीईसी को एक समय में स्मृति में रहने के लिए कारण बनता है। – micrub

2
सब बातें आप .csv फाइलों के साथ कर सकते हैं, मैं उपयोग करने का सुझाव के साथ

clojure-csv या clojure.data.csv। मैं ज्यादातर .csv फ़ाइल में पढ़ने के लिए क्लोजर-सीएसवी का उपयोग करता हूं।

यहां उपयोगिता लाइब्रेरी से कुछ कोड स्निपेट हैं जो मैं अपने अधिकांश क्लोजर प्रोग्रामों के साथ उपयोग करता हूं।

from util.core 

    (ns util.core 
     ^{:author "Charles M. Norton", 
     :doc "util is a Clojure utilities directory"} 

     (:require [clojure.string :as cstr]) 
     (:import java.util.Date) 
     (:import java.io.File) 
     (:use clojure-csv.core)) 

(defn open-file 
"Attempts to open a file and complains if the file is not present." 

[file-name] 
(let [file-data (try 
       (slurp file-name) 
       (catch Exception e (println (.getMessage e))))] 
    file-data)) 

(defn ret-csv-data 
"Returns a lazy sequence generated by parse-csv. 
Uses open-file which will return a nil, if 
there is an exception in opening fnam. 

parse-csv called on non-nil file, and that 
data is returned." 

[fnam] 
(let [csv-file (open-file fnam) 
     inter-csv-data (if-not (nil? csv-file) 
         (parse-csv csv-file) 
         nil) 

     csv-data 
     (vec (filter #(and pos? (count %) 
      (not (nil? (rest %)))) inter-csv-data))] 

    (if-not (empty? csv-data) 
     (pop csv-data) 
     nil))) 

(defn fetch-csv-data 
    "This function accepts a csv file name, and returns parsed csv data, 
    or returns nil if file is not present." 

    [csv-file] 
     (let [csv-data (ret-csv-data csv-file)] 
      csv-data)) 

एक बार जब आप एक .csv फ़ाइल में पढ़ लेंगे, तो आप इसकी सामग्री के साथ क्या करते हैं एक और मामला है। आम तौर पर, मैं एक वित्तीय प्रणाली से .csv "रिपोर्ट" ले रहा हूं, जैसे कि संपत्ति मूल्यांकन, और बिलिंग को अन्य वित्तीय प्रणाली के डेटाबेस में अपलोड करने के लिए डेटा स्वरूपित करना।

मैं अक्सर zipmap प्रत्येक .csv पंक्ति को तो मैं कॉलम नाम (कॉलम नामों में पढ़कर) द्वारा डेटा निकाल सकता हूं, या यहां तक ​​कि zipmap 'ped .csv पंक्तियों का अनुक्रम भी बना सकता हूं।

+0

धन्यवाद। फिर भी पूरी फ़ाइल को स्मृति में पढ़ने के लिए आपकी टिप्पणी सुनना दिलचस्प होगा, जो [बहुत बड़ी फाइलों] के लिए एक समस्या हो सकती है (http://clojurewise.blogspot.com/2011/02/reading-csv-files.html)। –

+0

जहां तक ​​मैं कह सकता हूं कि यह नक्शे का आलसी अनुक्रम है। क्लोजर-सीएसवी एक आलसी अनुक्रम देता है, और ज़िपमैप भी करता है। मैं ऐसा करता हूं। – octopusgrabbus