下午好。假设我有一个带有单个字母的utf-8文件,比如“f”(没有\ n和空格),我试着获得一系列行长。
(with-open [rdr (reader "test.txt")]
(doall (map #(.length %) (line-seq rdr))))
我得到了
=> (2)
为什么呢?是否有任何优雅的方法来获得第一个字符串的正确长度?
答案 0 :(得分:7)
Reading UTF-8 - BOM marker中介绍了Java中的BOM问题。似乎可以使用Apache的Commons中的BOMInputStream将其抽象出来,或者必须手动删除它,即
(defn debomify
[^String line]
(let [bom "\uFEFF"]
(if (.startsWith line bom)
(.substring line 1)
line)))
(doall (map #(.length %) (.split (debomify (slurp "test.txt")) "\n")))
如果您想使用line-seq
懒惰地阅读文件,例如因为它太大,您必须使用debomify
处理第一行。其余的可以正常阅读。因此:
(defn debommed-line-seq
[^java.io.BufferedReader rdr]
(when-let [line (.readLine rdr)]
(cons (debomify line) (lazy-seq (line-seq rdr)))))