私の質問は、マップとおそらくdoseqを使用して、次のreduceソリューションを書き直すにはどうすればいいですか?私は以下の解決策で多くの問題を抱えてきました。マイグレーションマップへの縮小
その解決策は、以下の問題を解決することです。具体的には、clojure-csvによって解析された2つのcsvファイルがあります。ベクトルの各ベクトルは、bene-dataおよびgic-dataと呼ぶことができます。私は、各行bene-dataの列の値を取得し、その値がgic-dataの1つの行の別の列であるかどうかを確認したいと思います。私はgic-dataに見つからないベーデータ値をベクトルに蓄積したい。私はもともと地図に蓄積しようとしましたが、それは印刷をデバッグしようとするとスタックのオーバーフローを開始しました。結局、私はこのデータを取って静的テキストと結合してレポートファイルに吐き出したいと思っています。
次のような機能:
(defn is-a-in-b
"This is a helper function that takes a value, a column index, and a
returned clojure-csv row (vector), and checks to see if that value
is present. Returns value or nil if not present."
[cmp-val col-idx csv-row]
(let [csv-row-val (nth csv-row col-idx nil)]
(if (= cmp-val csv-row-val)
cmp-val
nil)))
(defn key-pres?
"Accepts a value, like an index, and output from clojure-csv, and looks
to see if the value is in the sequence at the index. Given clojure-csv
returns a vector of vectors, will loop around until and if the value
is found."
[cmp-val cmp-idx csv-data]
(reduce
(fn [ret-rc csv-row]
(let [temp-rc (is-a-in-b cmp-val cmp-idx csv-row)]
(if-not temp-rc
(conj ret-rc cmp-val))))
[]
csv-data))
(defn test-key-inclusion
"Accepts csv-data param and an index, a second csv-data param and an index,
and searches the second csv-data instances' rows (at index) to see if
the first file's data is located in the second csv-data instance."
[csv-data1 pkey-idx1 csv-data2 pkey-idx2 lnam-idx fnam-idx]
(reduce
(fn [out-log csv-row1]
(let [cmp-val (nth csv-row1 pkey-idx1 nil)
lnam (nth csv-row1 lnam-idx nil)
fnam (nth csv-row1 fnam-idx)
temp-rc (first (key-pres? cmp-val pkey-idx2 csv-data2))]
(println (vector temp-rc cmp-val lnam fnam))
(into out-log (vector temp-rc cmp-val lnam fnam))))
[]
csv-data1))
この問題を解決するための私の試みを表しています。私は通常、repeatqを使用しない限り、結果のデータを蓄積する場所がないため、通常はdosqとmapを使用しようとしています。
ありがとうございます。私はそれをテストしています。 – octopusgrabbus
おそらく '(defnテストキーを含む[column1 column2](remove(set column2)column1))'?あなた自身を助けてください。 – Thumbnail