在clojure中读取文件并忽略第一行?

时间:2013-09-25 19:31:50

标签: text clojure functional-programming matching

使用this answer中的代码,我有

(defn repeat-image [n string]
  (println (apply str (repeat n string))))

(defn tile-image-across [x filename]
  (with-open [rdr (reader filename)]
    (doseq [line (line-seq rdr)]
      (repeat-image x line))))

...水平平铺ascii图像。现在,我怎么能“忽略”第一行?我这样做的原因是每个图像都有坐标(例如“20 63”)作为第一行,我不需要该行。我尝试了一些方法(保持索引,模式匹配)但我的方法感觉很人为。

1 个答案:

答案 0 :(得分:6)

假设您想跳过文件的第一行并像处理tile-image-across一样处理其余行,您只需将(line-seq rdr)替换为

即可
(next (line-seq rdr))

事实上,您应该考虑选择相关的行和处理:

;; rename repeat-image to repeat-line

(defn read-image [rdr]
  (next (line-seq rdr)))

(defn repeat-image! [n lines]
  (doseq [line lines]
    (repeat-line n line)))

with-open内使用:

(with-open [rdr ...]
  (repeat-image! (read-image rdr)))

如果您的文件包含多个图像而您需要跳过每个图像的第一行,最好的方法是编写一个函数来将seq行划分为一系列图像(如何完成取决于您的文件格式),然后将结果映射到(line-seq rdr)(map next ...))上:

(->> (line-seq rdr)
     ;; should partition the above into a seq of seqs of lines, each
     ;; describing a single image:
     (partition-into-individual-image-descriptions)
     (map next))

NB。懒惰的partition-into-individual-image-descriptions会产生懒惰的seqs序列;在with-open关闭读者之前,您需要使用它们。