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
相关产品推荐
相关产品推荐

