string - Clojure:删除第一个空格分隔的字符

标签 string parsing filter clojure

我想解析和过滤一个如下所示的文件:

@@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-seqreader 的组合为我提供了输入文件中的行序列。 with-open 确保文件在我完成后正确关闭。我将正则表达式应用于查找 @@ 的每一行,后跟数字和一些空格。

re-find 返回包含三个项目的向量:

  • 整个匹配行
  • 数字(正则表达式中的第一组)
  • 该行的其余部分(正则表达式中的第二组)

我使用 for 语句中的解构将它们绑定(bind)到 numberline (我对整个匹配行不感兴趣,所以我忽略了这一点)。我使用 :when 过滤选定的 sel-row,并仅生成(其余的)

由于我只期望文件中存在一个匹配项,因此我仅返回 for 构建的序列中的第一项。由于 formapline-seq 的惰性,这也会在找到项目后停止读取文件。

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

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

相关文章:

javascript - 如何使用 jQuery 删除变量上的 '_' 前缀?

perl - 机械化示例 - 安静简单但对我来说太复杂 : need explanations

java - 解析时访问 JSON 值

jquery - 当下面的元素进行动画处理时,如何强制 IE 继续对覆盖层应用不透明度?

java - 循环字符串和使用 str.replace 的意外输出

python - 当元组列表中相同项目的值是字符串时,对它们的值求和

javascript - 当我在字符串上使用 .split 和 .length 来查找某个字符在字符串中出现的次数时,为什么输出数字总是少一?

java - 用Java解析SQL文件并获取语句和注释

filter - DSP - IIR 滤波器的群延迟

javascript - 带过滤器的 ng-options 不起作用