gpt4 book ai didi

string - Clojure:第一个空格分隔字符的印章

转载 作者:行者123 更新时间:2023-12-04 06:05:33 25 4
gpt4 key购买 nike

我想解析和过滤一个看起来像这样的文件:

@@1 Row one. 
@@2 Row two.

我已经能够使用以下代码对行进行过滤:
(defn parse-text-cms [sel-row]
(let [f_data (st/split #"@@" (slurp "cms/tb_cms.txt"))]
;(prn (map #(take 1 %) f_data))))
(filter #(= (first (take 1 %)) sel-row) f_data)))

但是,这段代码给了我(如果 sel-row=1):
1 Row one.

我想砍掉那个 1 和之后的空间,所以有:
Row one.

我认为有一些序列魔法可以做到这一点。我只是想不出一个优雅的解决方案。

最佳答案

我将通过以下方式定义函数:

(defn parse-text-cms [sel-row]
(with-open [input (clojure.java.io/reader "cms/tb_cms.txt")]
(first
(for [[_ number line] (map (partial re-find #"@@(\d)+\s+(.*)")
(line-seq input))
:when (= number (str sel-row))]
line))))
line-seq 的组合和 reader给了我输入文件中的一系列行。 with-open确保文件在我完成后正确关闭。我将正则表达式应用于查找 @@ 的每一行后跟一个数字和一些空格。
re-find返回一个包含三个项目的向量:
  • 整条匹配线
  • 数字(正则表达式中的第一组)
  • 该行的其余部分(正则表达式中的第二组)

  • 我将这些绑定(bind)到 numberlinefor 中使用解构声明(我对整个匹配行不感兴趣,所以我忽略它)。我过滤了选定的 sel-row使用 :when并且只产生(其余的) line .

    因为我只希望文件中有一个匹配项,所以我只返回 for 构建的序列中的第一项。 .因为 for的懒惰, mapline-seq ,这也会在找到该项目后停止读取文件。

    但是,如果您对行进行大量查找,我建议您将整个文件加载到内存中,而不是每次都读取它。

    关于string - Clojure:第一个空格分隔字符的印章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8405193/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com