Z wszystkich rzeczy można zrobić z plikami .csv, sugeruję używanie clojure-CSV lub clojure.data.csv. Używam głównie clojure-csv do odczytu w pliku .csv.
Oto niektóre fragmenty kodu z biblioteki narzędziowej używanej w większości moich programów Clojure.
from util.core
(ns util.core
^{:author "Charles M. Norton",
:doc "util is a Clojure utilities directory"}
(:require [clojure.string :as cstr])
(:import java.util.Date)
(:import java.io.File)
(:use clojure-csv.core))
(defn open-file
"Attempts to open a file and complains if the file is not present."
[file-name]
(let [file-data (try
(slurp file-name)
(catch Exception e (println (.getMessage e))))]
file-data))
(defn ret-csv-data
"Returns a lazy sequence generated by parse-csv.
Uses open-file which will return a nil, if
there is an exception in opening fnam.
parse-csv called on non-nil file, and that
data is returned."
[fnam]
(let [csv-file (open-file fnam)
inter-csv-data (if-not (nil? csv-file)
(parse-csv csv-file)
nil)
csv-data
(vec (filter #(and pos? (count %)
(not (nil? (rest %)))) inter-csv-data))]
(if-not (empty? csv-data)
(pop csv-data)
nil)))
(defn fetch-csv-data
"This function accepts a csv file name, and returns parsed csv data,
or returns nil if file is not present."
[csv-file]
(let [csv-data (ret-csv-data csv-file)]
csv-data))
Po przeczytaniu pliku .csv, co zrobić z jego zawartością, to inna sprawa. Zwykle biorę .csv "raporty" z jednego systemu finansowego, takie jak oceny nieruchomości, i formatowanie danych, które mają być przesłane do bazy danych innego systemu finansowego, np. Fakturowanie.
Będę często zipmap
każdy wiersz .csv, więc mogę wyodrębnić dane według nazwy kolumny (po przeczytaniu w nazwach kolumn), a nawet wykonać sekwencję wierszy "ped .csv zipmap
".
Nice. Teraz pozostaje tylko "put-csv", pomożesz? –
Dodałem to. – mobyte
Zwróć uwagę na opcję: można użyć do wymuszenia jakichkolwiek efektów. Przechodzi kolejne kolejne z seq, zachowuje głowę i zwraca ją, co powoduje, że cały seq znajduje się w pamięci w tym samym czasie. – micrub