4

我正在解析一个 CSV 文件,因为 CSV 没有类型信息,所以所有值(浮点数、整数、日期等)都变成了字符串。为了修复这些类型,我创建了一个定义每个字段类型的映射。现在我需要将字段转换为正确的类型。

给定一个映射,其中值是包含整数和浮点数以及可能的其他类型的字符串,我需要返回一个映射,通过引用类型定义映射将这些值转换为正确的类型。下面是我提出的代码示例,但我觉得必须有更好的方法来做到这一点。

(mapv #(case ({"one" :int, "point-two" :float} (key %))
        :int {(key %) (Integer/parseInt (val %))}
        :float {(key %) (Float/parseFloat (val %))}
        {(key %) (val %)}) ; If there's no type defined, just return the original
 {"one" "1", "point-two" ".2", "three" "three"})

是否需要在每种情况下重新创建地图结果,似乎应该有一种方法来修改值,而无需触摸case. 使用默认测试重新创建地图条目{(key %) (val %)}似乎更加尴尬。

4

1 回答 1

3

您可以使用reduce-kvupdate-in

(def input {:a "1" :b "2.5" :c "more" :d "string" :e "keys"})

(def typetrans {:a #(Long/parseLong %) :b #(Double/parseDouble %)})

(reduce-kv #(update-in %1 [%2] %3) input typetrans)
; => {:a 1, :c "more", :b 2.5, :d "string", :e "keys"}

它只触及真正需要改变的键。不是整个地图。

于 2013-08-13T07:53:07.293 回答