对于 .csv 文件可以做的所有事情,我建议使用 clojure-csv 或 clojure.data.csv。我主要使用 clojure-csv 读取 .csv 文件。
以下是我在大多数 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))
读入 .csv 文件后,如何处理其内容是另一回事。通常,我从一个金融系统(如财产评估)获取 .csv“报告”,并将数据格式化以上传到另一个金融系统的数据库中,如计费。
我经常会使用zipmap
每个 .csv 行,这样我就可以按列名提取数据(已读取列名),甚至可以制作一系列zipmap
'ped .csv 行。