首页 > 解决方案 > 您可以从文本文件中创建地图吗?

问题描述

我有一个包含 10,000 行数字的文本文件,如下所示:

0 1076 1198 1722 1318 1642 9118 
1 6367 461 4772 1324 1735 487 5668 
2 4412 1028 209 3130 6902 8397 4373 905 3833 2403 
3 5103 1203 7063 4590 5866 445 5498 6217 6498 7298 
4 5544 1377 2284 3187 7931 5280 9572 7221 1916 9608 
5 2598 9480 7989 1904 845 6514 1200 8699 6214 3216 942 7870 6685 4430 5532 3128 9298 
6 9770 1223 8758 6103 9560 356 8469 3570 1178 3626 2985 8780

我想将索引 0 处的数字用作键,并将其余数字与分配给该键的值放在同一行。我以为我可以让程序逐行读取文件,然后手动将索引 0 分配为键,但我不确定 Clojure 的语法。

标签: clojuremappingtext-files

解决方案


我会提出以下(快速而肮脏的)方法:

我们逐行读取文件,由edn阅读器读取每一行。每一行的处理方式如下:

(defn process-line [line-str]
  (let [[x & xs] (clojure.edn/read-string (str "[" line-str "]"))]
    [x (vec xs)]))

user> (process-line "1 2 3 4 5")
;;=> [1 [2 3 4 5]]

现在我们只需要读取和处理每一行,然后将它们全部组装成一个映射:

user> (->> "/home/leetwin/dev/input.txt"
           clojure.java.io/reader
           line-seq
           (map process-line)
           (into {}))

输出:

{0 [1076 1198 1722 1318 1642 9118],
 1 [6367 461 4772 1324 1735 487 5668],
 2 [4412 1028 209 3130 6902 8397 4373 905 3833 2403],
 3 [5103 1203 7063 4590 5866 445 5498 6217 6498 7298],
 4 [5544 1377 2284 3187 7931 5280 9572 7221 1916 9608],
 5 [2598 9480 7989 1904 845 6514 1200 8699 6214 3216 942 7870 6685 4430 5532 3128 9298],
 6 [9770 1223 8758 6103 9560 356 8469 3570 1178 3626 2985 8780]}

此外,您可能想要过滤掉无效/空行或其他内容,因此您只需将过滤掉无效行插入管道:

user> (->> "/home/leetwin/dev/input.txt"
           clojure.java.io/reader
           line-seq
           (remove clojure.string/blank?)
           (map process-line)
           (into {}))

推荐阅读