将文件读入列表,每个元素代表文件的一行

发布于 2024-12-29 15:56:30 字数 180 浏览 3 评论 0原文

在 clojure 中,如何将文件读入序列,其中每一行都是序列中的一个元素。所以我想看看函数 get-lines 的定义,这样我就可以执行以下操作:

(def lines (get-lines "test.txt"))

lines 是一个非惰性序列。

In clojure, how do I read a file into a sequence where each line is one element in the sequence. So I'd like to see the definition of the function get-lines so I could do the following:

(def lines (get-lines "test.txt"))

and lines is a non-lazy sequence.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

喜你已久 2025-01-05 15:56:30

替代实现:

(require ['clojure.string :as 'str])

(defn get-lines [file]
  (str/split-lines (slurp file)))

此函数返回结果向量而不是 seq。

如果您不使用 1.3,则需要 clojure.contrib.string。

Alternate implementation:

(require ['clojure.string :as 'str])

(defn get-lines [file]
  (str/split-lines (slurp file)))

This function returns a vector of the results instead of a seq.

If you are not using 1.3, require clojure.contrib.string instead.

笑,眼淚并存 2025-01-05 15:56:30

要将惰性序列转换为非惰性序列,您可以使用 doall ,如下所示:

(use 'clojure.java.io)

(defn get-lines [fname]
  (with-open [r (reader fname)]
    (doall (line-seq r))))

To convert lazy sequence to non-lazy you can use doall like so:

(use 'clojure.java.io)

(defn get-lines [fname]
  (with-open [r (reader fname)]
    (doall (line-seq r))))
暮光沉寂 2025-01-05 15:56:30

您可以使用 line-seq。一个简单的例子:

(ns your.project
  (:require [clojure.java.io :as io]))

(defn count-lines [filename]
  (with-open [rdr (io/reader filename)]
    (count (line-seq rdr))))

请注意,line-seq惰性。您必须小心,不要在阅读器关闭后消耗序列。以下内容将不起作用:

(def lines (with-open [rdr (io/reader "some-file")]
             (line-seq rdr)))

(println (first lines))

第一个示例之所以有效,是因为 count 不是惰性的。

如果你想用这些行做一些事情(有副作用),你可能会发现 doseq 最有用:

;; copy every "short" line in file
(with-open [rdr (io/reader from)
            wrt (io/writer to)]
  (binding [*out* wrt]
    (doseq [line (line-seq rdr) :when (< (count line) 10)]
      (println line))))

You could use line-seq. A quick example:

(ns your.project
  (:require [clojure.java.io :as io]))

(defn count-lines [filename]
  (with-open [rdr (io/reader filename)]
    (count (line-seq rdr))))

Note that line-seq is lazy. You must be careful not to consume the sequence after the reader is closed. The following will not work:

(def lines (with-open [rdr (io/reader "some-file")]
             (line-seq rdr)))

(println (first lines))

The first example works because count isn't lazy.

If you want to do something (with side effects) with the lines you'll probably find doseq most useful:

;; copy every "short" line in file
(with-open [rdr (io/reader from)
            wrt (io/writer to)]
  (binding [*out* wrt]
    (doseq [line (line-seq rdr) :when (< (count line) 10)]
      (println line))))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文