使用代码来自这个答案 https://stackoverflow.com/a/7757674/1212338, 我有
(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”)作为第一行,而我不需要该行。我尝试了一些方法(保留索引、模式匹配),但我的方法感觉很做作。
假设您想跳过文件的第一行并像在中那样处理剩余的行tile-image-across
,你可以简单地替换(line-seq rdr)
with
(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)
and (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
关闭阅读器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)