Với tất cả những điều bạn có thể làm với tệp .csv, tôi khuyên bạn nên sử dụng clojure-csv hoặc clojure.data.csv. Tôi chủ yếu sử dụng clojure-csv để đọc trong tệp .csv.
Dưới đây là một số đoạn mã từ thư viện tiện ích tôi sử dụng với hầu hết các chương trình Clojure của mình.
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))
Khi bạn đã đọc tệp .csv, thì nội dung bạn làm với nội dung của nó là một vấn đề khác. Thông thường, tôi đang dùng .csv "báo cáo" từ một hệ thống tài chính, như đánh giá tài sản và định dạng dữ liệu được tải lên cơ sở dữ liệu của hệ thống tài chính khác, như thanh toán.
Tôi thường hoặc là zipmap
mỗi hàng .csv để tôi có thể trích xuất dữ liệu theo tên cột (đã đọc trong tên cột) hoặc thậm chí tạo một chuỗi các hàng .csv theo dõi zipmap
.
Tốt. Bây giờ tất cả còn lại là 'put-csv', bạn sẽ giúp gì? –
Tôi đã thêm nội dung này. – mobyte
Chú ý đến doall: doall có thể được sử dụng để buộc bất kỳ hiệu ứng nào. Đi qua các nexts kế tiếp của seq, giữ nguyên phần đầu và trả về, do đó làm cho toàn bộ số seq nằm trong bộ nhớ cùng một lúc. – micrub