Clojureでテキスト入出力を行う方法のメモ。
1 テキストファイル
;; 出力 (spit "test.txt" "Hello, World") ;; 入力 (assert (= "Hello, World" (slurp "test.txt")))
2 文字列
(with-open [in (java.io.StringReader. "Hello")] (assert (= \H (char (.read in)))) 'ok) (with-open [in (clojure.java.io/reader (.getBytes "Hello"))] (assert (= "Hello" (.readLine in))) 'ok) (with-in-str "hoge" (assert (= "hoge" (read-line))))
3 XML
;; [org.clojure/data.xml "0.0.6"] (require '[clojure.data.xml :as xml]) (xml/parse-str "<x id='1'><y>a</y><y id='2'>b</y></x>") ;; [enlive "1.0.0"] (require '[net.cgrand.enlive-html :as enlive]) (let [s "<x id='1'><y>a</y><y id='2'>b</y></x>" x (with-in-str s (enlive/xml-resource *in*))] (assert (= '("b") (:content (first (enlive/select x [:#2]))))))
4 CSV
;; [org.clojure/data.csv "0.1.2"] (require '[clojure.data.csv :as csv]) (let [s "a,\"b,c\",d\ne,fg,h\n"] (println (csv/read-csv s)) (csv/write-csv *out* (csv/read-csv s)) (assert (= s (with-out-str (csv/write-csv *out* (csv/read-csv s))))) 'ok)
5 JSON
;; [org.clojure/data.json "0.2.0"] (require '[clojure.data.json :as json]) (let [m (json/read-str "{\"k1\": 1, \"k2\": \"val\"}")] (println m) (assert (= m (json/read-str (json/write-str m)))) (with-open [out (clojure.java.io/writer "tmp.json")] (json/write m out)) (with-open [in (clojure.java.io/reader "tmp.json")] (assert (= m (json/read in)))) 'ok) ;; オプションとして :key-fn や :value-fn を指定すると read/write 時にキーと値を変換できる (println (= {:key 1.0} (json/read-str "{\"key\" : 1}" :key-fn keyword :value-fn #(double %2))))
6 INIファイル
;; [clojure-ini "0.0.1"] (require '[clojure-ini.core :as ini]) (spit "test.ini" "[a]\nb=c\nd=e\n") (assert (= {:a {:b "c", :d "e"}} (ini/read-ini "test.ini" :keywordize? true)))
0 件のコメント:
コメントを投稿