【问题标题】:Casting values of a map to their proper types in clojure将地图的值转换为 clojure 中的正确类型
【发布时间】:2013-08-13 07:04:08
【问题描述】:

我正在解析一个 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 %)} 为默认测试重新创建地图条目似乎更加尴尬。

【问题讨论】:

    标签: xml clojure


    【解决方案1】:

    您可以使用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"}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多