7  How to get data out of a notebook

(ns chapter-2-input-output.2-3-exporting-data
  {:nextjournal.clerk/toc true}
  (:require
   [clojure.data.csv :as csv]
   [clojure.edn :as edn]
   [clojure.java.io :as io]
   [nextjournal.clerk :as clerk]
   [tablecloth.api :as tc]
   [scicloj.kind-clerk.api :as kind-clerk]))
(kind-clerk/setup!)
:ok
(def consistent-data
  (map-indexed (fn [index _coll] (str "cell-" index))
               (range 10)))
(def data (take 20 (repeat (zipmap (range 10) consistent-data))))

7.1 Writing to a CSV file

depends what the data looks like for a seq of maps: headers are not necessarily sorted, put them in whatever order you want here Clojure maps make no guarantees about key order, make sure to order values, i.e. use the same header row to get the values from each map

(let [headers (-> data first keys sort)
      rows (->> data (map (fn [row]
                            (map (fn [header]
                                   (get row header)) headers))))]
  (with-open [writer (io/writer "data/csv-output.csv")]
    (csv/write-csv writer (cons headers rows))))
nil

Tablecloth can also export csvs (among other formats)

(def tc-dataset (tc/dataset data))
(tc/write-csv! tc-dataset "data/tc-output.csv")
21

7.2 Writing nippy

(tc/write! tc-dataset "data/tc-nippy.nippy")
nil

Read this also with tablecloth:

(tc/dataset "data/tc-nippy.nippy")

data/tc-nippy.nippy [20 10]:

0 7 1 4 6 3 2 9 5 8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8
cell-0 cell-7 cell-1 cell-4 cell-6 cell-3 cell-2 cell-9 cell-5 cell-8

7.3 Leave data in Clojure files

(->> data pr-str (spit "data/clojure-output.edn"))
nil

This can be consumed later with:

(with-open [reader (io/reader "data/clojure-output.edn")]
  (edn/read (java.io.PushbackReader. reader)))
({0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"}
 {0 "cell-0",
  7 "cell-7",
  1 "cell-1",
  4 "cell-4",
  6 "cell-6",
  3 "cell-3",
  2 "cell-2",
  9 "cell-9",
  5 "cell-5",
  8 "cell-8"})

7.4 Notebook artifacts

Clerk supports publishing your namespaces as HTML (like this website!) To do that call

(comment
  (clerk/build! {:paths "path/to/files..."
                 :index "book/index.clj"}))

More information in Clerk’s docs: https://book.clerk.vision/#static-building HTML pages Other formats, options for exporting notebooks? PDFs? Partial artifacts, e.g. export just a graph Writing to a database?

source: book/chapter_2_input_output/2_3_exporting_data.clj