我正在尝试循环一组字符串,删除多余的文本。它有效,但太好了。给定这样的输入:
#{"TORCASO,133114,117,0.04,89045.38,99.00,0.00,0.00,0.00,0.00,0.00" "POTOCZNY,98770,170,0.06,87231.39,98.82,0.00,(S),0.00,0.00,(S)"}
Run Code Online (Sandbox Code Playgroud)
我的输出如下所示:
#{\A \C \N \O \P \R \S \T \Y \Z}
Run Code Online (Sandbox Code Playgroud)
但我希望它看起来像这样:
#{"TORCASO" "POTOCZNY"}
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
(defn shorten-string
[string]
(first (str/split string #",")))
(defn handle-csv
[strings]
(loop [remaining-strings strings final-set #{}]
(if (empty? remaining-strings)
final-set
(let [[part & remaining] remaining-strings]
(recur remaining
(into final-set
(shorten-string part)))))))
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
使用loop / recurfor 循环应该是你最后的手段——通常有一些更好的函数。在这种情况下,您应该使用map:
(def data #{"TORCASO,133114,117,0.04,89045.38,99.00,0.00,0.00,0.00,0.00,0.00" "POTOCZNY,98770,170,0.06,87231.39,98.82,0.00,(S),0.00,0.00,(S)"})
(defn shorten-string [string]
(first (clojure.string/split string #",")))
(defn handle-csv [strings]
(->> strings
(map shorten-string)
(into #{})))
Run Code Online (Sandbox Code Playgroud)
(->>是线程最后宏)
例子:
(handle-csv data)
=> #{"TORCASO" "POTOCZNY"}
Run Code Online (Sandbox Code Playgroud)