使用 Clojure 将整数数据提取到我的 txt 文件中

extracting integer's data into my txt file With Clojure

我是 clojure 的新手,我想提取 txt 文件中的数据(仅整数)以进行差异处理。

第一次我想提取 txt 文件中的整数数据: ({score 1} {:score 2} {:score 3} {:score 4} {:score 5} {:score 6} {:score 7} {:score 8} {:score 9} {:score 10} {:score 11} {:score 12} {:score 13} {:score 14} {:score 11} {:score 12} {:score 13} {:score 14} {:score 15} {:score 16} {:score 17} {:score 18} {:score 19} {:score 20} {:score 21} {:score 22} {:score 23} {:score 24} {:score 11} {:score 2} {:score 3} {:score 5} {:score 8} {:score 4} {:score 5} {:score 2} {:score 2} {:score 8} {:score 4} {:score 7} {:score 5} {:score 2} {:score 5} {:score 5} {:score 2} {:score 6} {:score 2} {:score 5} {:score 2} {:score 3} {:score 5} {:score 2} {:score 3} {:score 5} {:score 23} {:score 5} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 7} {:score 0} {:score 0} {:score 0} {:score 0} {:score 0} {:score 0} {:score 0} {:score 0}

在此之后我想在另一个文件 txt 上提取数据以应用所有数据之间的差异操作。

第二个 txt 文件如下:

   `  <  name 1>: <45>   <name 2 >: <78>     <  name 3>: <100>  <name 4 >: <8> `

如果我是正确的,你需要这样的数据:

(1 2 3 4 5 6 7 8 9 10 11 12 13 14 11 12 13 14 15 16 17 18 19 20 21 22 23 24 11)

如果是这样,那么您的解决方案就在这里

(map :score (read-string(slurp "file-location")))

这是您第二个问题的解决方案(这与您的第一个问题完全无关,后者的格式很好地为 EDN 值)。

对于此示例 (foo.txt):

<foo 1>: <45> <bar 2>: <78> <baz 3>: <100> <qux 4>: <8>

以下创建名称到值的映射:

(defn data-to-map [f]
  (reduce (fn [acc i] 
            (assoc acc (nth i 1) (nth i 2)))
          {} 
          (re-seq #"<([^>]+)>: <([^>]+)>" (slurp f))))

它使用正则表达式将您的模式分解为 <some name>: <some value> 并使用名称作为键将它们放入地图中。

注意,在你的问题中,你将冒号放在右括号旁边,如果有空格(如你对@piyushmandovra 的评论),那么你必须调整正则表达式以适应额外的 \s 空白值。

示例 repl 输出:

user> (data-to-map "foo.txt")
{"qux 4" "8", "baz 3" "100", "bar 2" "78", "foo 1" "45"}

如果您只想要值,而不是第二个样本中的名称(不知道为什么,但这正是您最初要求的)

(defn data-vals-to-array [f] 
  (reduce (fn [acc i] 
            (conj acc (nth i 2)))
          []
          (re-seq #"<([^>]+)>: <([^>]+)>" (slurp f))))

举例

user> (data-vals-to-array "foo.txt")
["45" "78" "100" "8"]

在这种情况下,它会丢弃名称,只是 conj 将数据放入向量中。

您可以将缩减函数替换为简单的 #(conj %1 (last %2)),但为了清楚起见,我将其与地图示例保持相似。

为简单起见,我将所有内容都保留为字符串。如果您的数据足够好,请使用 this SO answer

解析整数