【问题标题】:Clojure map outside scopeClojure 地图超出范围
【发布时间】:2017-11-20 03:17:45
【问题描述】:

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

(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)))
            )
          )
        )
      )
    )
  )
)

任何帮助将不胜感激。

【问题讨论】:

  • 什么是tableprintln 也将返回 nilassoc 不会 修改任何(def table {}) 你之前可能已经放在某个地方。

标签: vector file-io clojure hashmap


【解决方案1】:

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

首先:重要的是要意识到 map 会将函数的结果保存到一个新的集合中。就像 cfrick 提到的那样,println 返回 nil 并且 assoc 不会更改地图。

我在这里猜测你想要做什么:你想要一个字典集合,其中每个字典都有两个键,如下所示:

[
  { :code 1 :instructor "blah"} 
  { :code 2 :instructor "boo" }
]

您需要这些值来自文件,但您只想保存包含“201609”但不包含“TBA”的行

首先是一些一般性的评论:

  • 您可能希望将此函数拆分为更小的部分。一种可能是检查行 (contains 201609 but not 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))))

你现在可以这样调用这个函数:(read-file-and-parse "test.txt" "201609" "TBA")

如果您想将此函数的结果添加到您的table,您可以使用concat。但同样,这将返回您列表的新版本(添加了新条目),并且不会更改您之前定义的列表。

欢迎来到函数式编程:-)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2018-07-30
    相关资源
    最近更新 更多