使用 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
解析整数
我是 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
解析整数