/src/clojure/csv/impexp.clj

https://github.com/rururu/simpro-scene · Clojure · 70 lines · 65 code · 5 blank · 0 comment · 4 complexity · 350ae255341db726ab1324f61c851e1e MD5 · raw file

  1. (ns csv.impexp
  2. (:use protege.core)
  3. (:require
  4. [clojure-csv.core :as csv]
  5. [semantic-csv.core :as sc :refer :all])
  6. (:import
  7. edu.stanford.smi.protege.model.ValueType))
  8. (defn read-csv [pth]
  9. (sc/slurp-csv pth))
  10. (defn write-csv [pth data]
  11. (sc/spit-csv pth data))
  12. (defn predicate [pre val]
  13. (if (empty? pre)
  14. (boolean val)
  15. (eval (read-string (str "(" pre " \"" val "\")")))))
  16. (defn csv-load
  17. ([hm inst]
  18. (let [mp (into {} hm)
  19. clz (mp "class")
  20. cols (mp "csv-columns")
  21. file (mp "csv-file")
  22. pre (mp "predicate")
  23. cln (.getName clz)
  24. cmp (reduce
  25. #(assoc %1 (keyword (sv %2 "csv-column"))
  26. (.getName (sv %2 "slot")))
  27. {}
  28. cols)]
  29. (csv-load file cln cmp pre)))
  30. ([file cln cmp pre]
  31. (let [data (read-csv file)]
  32. (doseq [d data]
  33. (let [inst (crin cln)]
  34. (doseq [[col val] d]
  35. (let [sln (cmp col)
  36. slt (slt sln)
  37. v (read-string val)
  38. svl (condp = (.getValueType slt)
  39. ValueType/FLOAT (float v)
  40. ValueType/INTEGER (int v)
  41. ValueType/BOOLEAN (predicate pre v)
  42. val)]
  43. (ssv inst sln svl))))))))
  44. (defn csv-save
  45. ([hm inst]
  46. (let [mp (into {} hm)
  47. clz (mp "class")
  48. cols (mp "csv-columns")
  49. file (mp "csv-file")
  50. cln (.getName clz)
  51. cmp (reduce
  52. #(assoc %1 (keyword (sv %2 "csv-column"))
  53. (.getName (sv %2 "slot")))
  54. {}
  55. cols)]
  56. (csv-save file cln cmp)))
  57. ([file cln cmp]
  58. (let [inss (cls-instances cln)
  59. data (for [i inss]
  60. (reduce-kv
  61. #(assoc %1 (keyword %2)
  62. (str (sv i %3)))
  63. {}
  64. cmp))]
  65. (write-csv file data))))