clojure - 您可以从文本文件中创建地图吗?
问题描述
我有一个包含 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 的语法。
解决方案
我会提出以下(快速而肮脏的)方法:
我们逐行读取文件,由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 {}))
推荐阅读
- c# - Unity:测试返回 IPromise 的异步函数
- c# - 无法解析类型“Microsoft.AspNetCore.DataProtection.IDataProtector”的服务
- javascript - 将 PHP 变量添加到 new Date()
- c++ - 如何正确添加 const char 类型的变量?
- android - 是否可以使用 MockK 监视暂停 Android Room DAO 功能
- python - Tkinter 中的垂直滚动条
- javascript - drake.on drop 事件未发生反应 dragulla
- java - 如何从 ddl 更新中跳过一些实体
- qt - QML 中的多色渐变
- python - 将值插入列表 - 附加不起作用