Data extraction from Map

Programming Technology  ICT Technology  Front-end development in Javascript  Web Technology  Clojure and Functional Programming  Digital Transformation

When we process data in Clojure, we often use Map data access. For example, let’s say you have a postgresql database output or a CSV data map like the one below.

(def output-text [{:id 1 :text "aaa" :tag true}
                 { :id 2 :text "bbb" :tag false}
                 { :id 3 :text "ccc" :tag true}
                 { :id 4 :text "ddd" :tag true}
                 { :id 5 :text "eee" :tag false}])

If you want to extract arbitrary :text data from this

(defn output-data [n]
  (->> output-text
     (filter #(= (:text %) n))
      first))

if we take

(output-data "ccc") 
->  {:id 3 :text "ccc" :tag true}

If you use the “re-find” function instead of the “=” function, you can do a simple full-text search as follows. If you use the “re-find” function instead of the “=” function, you can do a simple full-text search like the following.

(defn search-data [n]
       (filter #(re-find  (re-pattern n) (:text %)) output-text))

Now, for a more complex nested map structure like the output of rdf store (e.g. generated from xml like this

<root>
  <records>
    <record id="1">record01</record>
    <record id="2">record02</record>
  </records>
  <record id="3">record03</record>
</root>

Using clojure.data.zip, set the leiningen dependency as follows

[org.clojure/data.zip "1.0.0"]

The data is extracted in the following way.

(use 'clojure.data.zip.xml)
(require ['clojure.xml :as 'xml])
(require ['clojure.zip :as 'zip])

(xml-> (zip/xml-zip (xml/parse "in.xml")) :records :record text)
; -> ("record01" "record02")

(xml-> (zip/xml-zip (xml/parse "in.xml")) :record text)
; -> ("record03")

(xml-> (zip/xml-zip (xml/parse "in.xml")) :record (attr :id))
; -> ("3")

For data with a complex structure, it would be simpler to use SAPRQL or other queries to get processed data directly from the DB via the API.

コメント

タイトルとURLをコピーしました