使用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”)作为第一行,我不需要该行。我尝试了一些方法(保持索引,模式匹配)但我的方法感觉很人为。
答案 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
关闭读者之前,您需要使用它们。