7 How to get data out of a notebook
ns chapter-2-input-output.2-3-exporting-data
(:nextjournal.clerk/toc true}
{:require
(:as csv]
[clojure.data.csv :as edn]
[clojure.edn :as io]
[clojure.java.io :as clerk]
[nextjournal.clerk :as tc]
[tablecloth.api :as kind-clerk])) [scicloj.kind-clerk.api
(kind-clerk/setup!)
:ok
def consistent-data
(fn [index _coll] (str "cell-" index))
(map-indexed (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)
(->> data (map (fn [row]
rows (map (fn [header]
(get row header)) headers))))]
(with-open [writer (io/writer "data/csv-output.csv")]
(cons headers rows)))) (csv/write-csv writer (
nil
Tablecloth can also export csvs (among other formats)
def tc-dataset (tc/dataset data)) (
"data/tc-output.csv") (tc/write-csv! tc-dataset
21
7.2 Writing nippy
"data/tc-nippy.nippy") (tc/write! tc-dataset
nil
Read this also with tablecloth:
"data/tc-nippy.nippy") (tc/dataset
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
(:paths "path/to/files..."
(clerk/build! {: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?