次のベクトルが clojure-csv によって解析された場合
["123/45678" "RET" "xxx-yy-zzzz" "TOAST" "FRENCH" "SOME KIND OF COVERAGE - INSURED" "0" "12345678" "102020"]
nth は、次の関数で例外を引き起こしています。
(defn reduce-csv-row
"Accepts a csv-row and a list of columns to extract, and
reduces the csv-row to the selected list."
[csv-row col-nums]
(reduce
(fn [out-csv-row col-num]
;Without testing for empty, a
;java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Number
;would occur if the file contained a blank line.
(let [temp-val
(try
(nth csv-row col-num nil)
(catch Exception e (do
(println csv-row, " ", col-num)
(.getMessage e))))])
(conj out-csv-row (nth csv-row col-num nil)))
[]
col-nums))
try .. catch は最終的にはなくなります。デバッグの出力を最小限にしたかっただけです。
私の人生では、nth が例外をスローする理由を理解できません。replではありません。また、引用されたフィールドを持つ別の .csv ファイルのデータは、私が含めたサンプル行に非常に似ていますが、失敗しません。これは目に見えない微妙な何かによるものだと思います。
この問題をデバッグするための助けや方法をいただければ幸いです。
ありがとうございました。
編集:
上記の最初の方法を使用すると、Java 文字列を整数に変換できないことを示すエラーが表示されます。
マスク ベクトルは、次の関数を使用して整数に変換されます。
(defn cvt-mask-numeric
"Converts a vector mask to numbers. It was read from a file, so it's a series of strings.
Build in some protection in case we get a non-string. Don't want stuff to blow up."
[csv-mask]
(map #(utl/parse-int %) csv-mask))
次の方法を使用して
(defn reduce-csv-row
"Accepts a csv-row and a list of columns to extract, and
reduces the csv-row to the selected list."
[csv-row col-nums]
(try
(map #(nth csv-row %) col-nums)
(catch Exception e (.getMessage e) (println csv-row, " ", col-nums))))
java.lang.IndexOutOfBoundsException が発生します
問題は、2 番目のマスクをコンバーターに渡すのを忘れたことです。
(let [bene-csv-data (bcsv/strip-csv-header (fetch-csv-data (:ifn1 opts)))
bene-csv-mask (bcsv/cvt-mask-numeric (first (fetch-csv-data (:ifm1 opts))))
gic-csv-data (bcsv/strip-csv-header (fetch-csv-data (:ifn2 opts)))
gic-csv-mask (first (fetch-csv-data (:ifm2 opts)))
コメントありがとうございます。戻って見るのに役立ちました。