You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

F#中如何优雅将需向下补全的透视CSV数据分组生成Map

实现思路

核心逻辑分两步:先完成邮箱字段的向下填充,再按邮箱分组聚合商品,最终转成Map格式。你可以直接用F#原生的List.mapFold实现带状态的遍历,代码如下:

let rows = 
  [
    [ "alice@example.org";   "apple"  ]
    [ "";                    "banana" ]
    [ "";                    "cherry" ]
    [ "bob@example.org";     "apple"  ]
    [ "charlie@example.org"; "banana" ]
    [ "";                    "cherry" ]
  ]

let purchases =
    rows
    // 遍历行,维护上一个有效邮箱作为状态,补全每行的邮箱字段
    |> List.mapFold (fun lastValidEmail row ->
        let currentEmail = 
            if System.String.IsNullOrEmpty(row.[0]) then lastValidEmail
            else row.[0]
        (currentEmail, row.[1]), currentEmail
    ) ""
    // 提取补全后的 (邮箱, 商品) 元组集合
    |> fst
    // 按邮箱分组
    |> List.groupBy fst
    // 提取每个邮箱对应的商品列表
    |> List.map (fun (email, purchaseRecords) -> 
        email, purchaseRecords |> List.map snd
    )
    // 转换为Map
    |> Map.ofList

运行后得到的purchases完全符合你要求的输出格式。

补充说明

如果你的原始数据存在首行邮箱为空的异常场景,可以在mapFold的初始状态位置自定义兜底逻辑,比如抛出格式错误、或者填充默认邮箱标识即可。

内容的提问来源于stack exchange,提问作者sdgfsdh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 16:18:03