3

使用这个答案中的代码,我有

(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”)作为第一行,我不需要这条线。我尝试了一些方法(保持索引、模式匹配),但我的方法感觉做作。

4

1 回答 1

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)))

相反,如果您的文件包含多个图像并且您需要跳过每个图像的第一行,那么最好的方法是编写一个函数来将行序列划分为图像序列(如何完成取决于格式您的文件),然后一遍又一遍地映射(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))

注意。使用惰性partition-into-individual-image-descriptions这将产生惰性序列的惰性序列;您需要在with-open关闭阅读器之前使用它们。

于 2013-09-25T19:45:07.337 回答