F#中将CsvFile转换为Json对象数组的更优实现咨询
F# CSV转JSON数组优化方案
你可以用纯函数式的写法消除所有可变变量,实现更符合F#风格的简洁版本,功能和你原有实现完全一致:
let csvFileToJsonList (csvFile: FSharp.Data.CsvFile) = let heads = match csvFile.Headers with | Some h -> h | None -> Array.init csvFile.NumberOfColumns (fun i -> $"Column{i+1}") csvFile.Rows |> Seq.map (fun row -> Array.zip heads row.Columns |> Map.ofSeq) |> Seq.toList |> System.Text.Json.JsonSerializer.Serialize
如果需要输出格式化的带缩进的JSON,可以修改序列化部分的代码:
let csvFileToJsonList (csvFile: FSharp.Data.CsvFile) = let heads = match csvFile.Headers with | Some h -> h | None -> Array.init csvFile.NumberOfColumns (fun i -> $"Column{i+1}") let options = System.Text.Json.JsonSerializerOptions(WriteIndented = true) csvFile.Rows |> Seq.map (fun row -> Array.zip heads row.Columns |> Map.ofSeq) |> Seq.toList |> fun data -> System.Text.Json.JsonSerializer.Serialize(data, options)
优化点说明
- 全程无可变变量,采用函数式数据变换逻辑,代码更简洁易维护
- 使用
Array.zip直接配对表头和行的列值,省去手动遍历索引的冗余步骤 - 调用
Map.ofSeq直接从键值对序列生成Map对象,不需要手动累加修改Map实例 - 优化了无表头场景的处理逻辑,会自动生成
Column1、Column2格式的默认表头,适配不同列数的CSV文件
内容的提问来源于stack exchange,提问作者Marcus Nätteldal
相关产品推荐
相关产品推荐

