Miki Tebeka avatar Miki Tebeka committed b00f258

Conversions and adding missing tests

Comments (0)

Files changed (2)

 (ns csvlib
   (import com.csvreader.CsvReader))
 
-(defn- record-seq [filename]
+(defn make-converter
+  "Make a converter function from a conversion table"
+  [converison]
+  (let [convert (fn [key value] ((get converison key identity) value))]
+    (fn [record]
+      (zipmap (keys record) (map #(convert % (record %)) (keys record))))))
+
+(defn- record-seq 
+  "Reutrn a lazy sequence of records from a CSV file"
+  [filename]
   (let [csv (CsvReader. filename)
         read-record (fn [] 
                       (when (.readRecord csv) 
 (defn read-csv
   "Return a lazy sequence of records (maps) from CSV file.
 
-  With header map will be header->value, otherwise it'll be position->value."
-  ([filename] (read-csv filename false))
-  ([filename headers?]
+  With header map will be header->value, otherwise it'll be position->value.
+  `conversions` is an optional map from header to a function that convert the
+  value."
+  ([filename] (read-csv filename false nil))
+  ([filename headers?] (read-csv filename headers? nil))
+  ([filename headers? conversion]
    (let [records (record-seq filename)
+         convert (make-converter conversion)
          headers (if headers? (first records) (range (count (first records))))]
-    (map #(zipmap headers %) (if headers? (rest records) records)))))
+     (map convert
+          (map #(zipmap headers %) (if headers? (rest records) records))))))
   

test/csvlib_test.clj

+(ns csvlib-test
+  (:use [csvlib] :reload-all)
+  (:use [clojure.test]))
+
+(deftest test-no-headers
+  (let [records (read-csv "test/toons.csv")]
+    (is (= (count records) 4))
+    (is (= (first records) {0 "Name" 1 "Animal" 2 "Funny"}))
+    (is (= (last records) { 0 "Elmer" 1 "Pig" 2 "No"}))))
+
+(deftest test-headers
+  (let [records (read-csv "test/toons.csv" true)]
+    (is (= (count records) 3))
+    (is (= (first records) {"Name" "Duffy" "Animal" "Duck" "Funny" "Yes"}))
+    (is (= (last records) { "Name" "Elmer" "Animal" "Pig" "Funny" "No"}))))
+
+(deftest test-convert
+  (let [conversion {"Funny" {"Yes" true "No" false}}
+        records (read-csv "test/toons.csv" true conversion)]
+    (is (= (count records) 3))
+    (is (= ((first records) "Funny") true))))
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.