Vector 范围外的Clojure映射

Vector 范围外的Clojure映射,vector,file-io,clojure,hashmap,Vector,File Io,Clojure,Hashmap,我试图将数据保存到某种类型的集合中,但我的程序正在将所有内容保存到单独的映射中。我想把它做成一张地图 (defn readFile [] (map (fn [line] (clojure.string/split line #";")) (with-open [rdr (reader "C:/Users/Rohil/Desktop/textfile.txt")] (doseq [[idx line] (map-indexed vector(line-seq r

我试图将数据保存到某种类型的集合中,但我的程序正在将所有内容保存到单独的映射中。我想把它做成一张地图

(defn readFile []
    (map (fn [line] (clojure.string/split line #";"))
      (with-open [rdr (reader "C:/Users/Rohil/Desktop/textfile.txt")]
        (doseq [[idx line] (map-indexed vector(line-seq rdr))]

          (if(.contains line "201609")
            (if(not(.contains line "TBA"))
              (println(assoc table :code(nth(clojure.string/split line #";")3) :instructor(nth(clojure.string/split line #";")19)))
            )
          )
        )
      )
    )
  )
)

任何帮助都将不胜感激

看起来你正在适应clojure:-)我也经历了同样的过程。坚持住,这是值得的

第一:重要的是要认识到map将把函数的结果保存到一个新集合中。正如cfrick提到的,
println
返回
nil
,并且assoc不会更改映射

我猜你想做的是:你想要一个dict集合,每个dict都有两个键,就像这样:

[
  { :code 1 :instructor "blah"} 
  { :code 2 :instructor "boo" }
]
您需要这些值来自文件,但您只希望保存行中包含“201609”但不包含“TBA”的行

首先是一些一般性意见:

  • 您可能希望将此函数拆分为更小的部分。一个可以是检查行(
    包含201609但不包含tba
    ),另一个可以读取文件
  • 我知道这是你问题的标题,但很可能有一种比更改全局变量更好的方法。也许您可以让函数
    readFile
    返回表
  • 如果可以将参数传递给函数,请尝试
  • 我不确定你想用这行代码做什么(doseq[…请给我们更多的上下文。我将忽略它
以下是一个可能的解决方案:

(ns test
  (:require  [clojure.string :as s]
             [clojure.java.io :as io]))

(defn line-filter [include exclude line]
  (and (not (s/includes? line exclude))
       (s/includes? line include)))

(defn process-line [line]
  (let [line-parts (s/split line #";")
        code (nth line-parts 3)
        instructor (nth line-parts 19)]
    {:code code :instructor instructor}))

(defn read-file [file-name]
  (s/split (slurp (io/resource file-name)) #"\n"))

(defn parse-lines [lines] 
  (map process-line lines))


(defn read-file-and-parse
  "This function will read a file, process the lines, and output a collection of maps"
  [filename search-for exclude]
  (parse-lines
   (filter #(line-filter search-for exclude %)
    (read-file filename))))
您现在可以这样调用此函数:
(读取文件并解析“test.txt”201609“TBA”)

如果要将此函数的结果添加到
表中
,可以使用
concat
。但是,这将返回列表的新版本(添加了新条目),而不会更改先前定义的列表


欢迎使用函数式编程:-)

什么是
?另外
println
将返回
nil
,并且
assoc
不会修改您以前可能放在某处的任何
(def table{})