A long time ago, when I first started to learn how to program, I was taught a basic programming fundamental. In order to test your program, your program needs to be able to read and write to some device, preferably a terminal. One of my first goals in learning Clojure was to be able to read and write on a command line and process files.
In my line of work, quite a bit of which is involved with data transaction between applications, our form of currency is the comma-separated values file, known as a “dot csv” (.csv) file. Almost every proprietary spreadsheet program, like Excel and open source spreadsheet like OpenOffice.org knows how to read and write a .csv file, so this seemed like a good place to start. Almost every commercial application that uses a database, like a general ledger accounting program, knows how to create and import a .csv file.
With a lot of support from the Clojure group on Google Groups — http://groups.google.com/group/clojure — this is an interim program, whose file name is hardwired. Nevertheless, it prints out the first column of data quite nicely.
(ns test-csv (:gen-class) (:use clojure-csv.core))</code> (defn process-file "Process csv file and prints first item in every row" [file-name] (let [data (slurp file-name) rows (parse-csv data)] (dorun (map #(println (first %)) rows)))) (defn -main [& args] (process-file "resultset.csv"))
This is a fairly unsophisticated program. The function uses the slurp function to read in the file, and also uses the clojure-contrib library module clojure-csv to parse the csv file. In this case, I wanted the first column of the spreadsheet. clojure-csv returns a lazy sequence of rows from the spreadsheet. The first function grabs the first column.
As the Google Clojure Users Group pointed out, here is a better way to handle a default file
(defn -main [& args] (with-command-line args "Get csv file name" [[file-name ".csv file name" "resultset.csv"]] (println "filename:" file-name) (process-file file-name))