5

こんにちは。「f」(\ nとスペースなし)と言う1文字のutf-8ファイルがあり、一連の行の長さを取得しようとしているとします。

(with-open [rdr (reader "test.txt")] 
  (doall (map #(.length %) (line-seq rdr))))

そして、私は得る

=> (2)

なんで?最初の文字列の正しい長さを取得するためのエレガントな方法はありますか?

4

1 に答える 1

7

JavaでのBOMの問題については、「UTF-8の読み取り-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)))))
于 2012-12-09T16:45:47.790 に答える