将第3列的CSV行转换为Clojure列表的最佳方法是什么?
357302041352401, 2012-08-27 19:59:32 -0700, 100, ["SNIA34", "M33KLC", "M34KLC", "W35REK", "SRBT", "MODE", "BFF21S", "CC12", "RCV56V", "NBA1", "RESP", "A0NTC", "PRNK", "WAYS", "HIRE", "BITE", "INGA1", "M32MOR", "TFT99W", "TBF5P", "NA3NR"]
答案 0 :(得分:2)
假设您已经可以阅读csv文件......
您可以将read-string与into
结合使用user=> (def your_csv_column "[\"SNIA34\", \"M33KLC\", \"M34KLC\"]")
#'user/your_csv_column
user=> (into '() (read-string your_csv_column))
("M34KLC" "M33KLC" "SNIA34")
答案 1 :(得分:2)
您可以使用Clojure Csv来执行此操作。
答案 2 :(得分:1)
您的数据很有趣,它似乎包含传统的逗号分隔行,后面是括号中的数据。我无法确定括号内的数据是否是.csv文件中的表示或读取后想要的,但无论如何,这是我读取.csv文件的方式:
我的图书馆使用clojure-csv的project.clj:
(defproject util "1.0.4-SNAPSHOT"
:description "A general purposes Clojure library"
:dependencies [[org.clojure/clojure "1.4.0"]
[clojure-csv/clojure-csv "1.3.2"]]
:aot [util.core]
:omit-source true)
我的图书馆的core.clj标题:
(ns util.core
^{:author "Charles M. Norton",
:doc "util is a Clojure utilities directory containing things
most Clojure programs need, like cli routines.
Created on April 4, 2012"}
(:require [clojure.string :as cstr])
(:import java.util.Date)
(:import java.io.File)
(:use clojure-csv.core))
我的库的函数返回一个解析为矢量矢量的.csv文件。
(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))]
;removes blank sequence at EOF.
(pop csv-data)))
(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))
我发现非常有帮助的是避免使用来自SO和其他来源的非常有用的建议 - 并且鉴于我的大部分.csv数据都是来自数据库查询,我将每个zipmap列映射到每个.csv seqeuence(行),然后通过map键对该数据进行操作。它简化了我的工作。