csv - F# - CSV 到两键字典

标签 csv f#

我有具有以下结构的本地化 CSV 文件

Key, Language1, Language2, Language3
some key, translation1, translation2, translation3

我想编写一个函数,从我可以轻松获得翻译的内容中返回多维数组。例如

translations["some key"]["Language1"] 返回“translation1”

我只写了文件的加载

open GleedsSnags.Localization
open FSharp.Data

type Loc = CsvProvider<"Localization.csv">
let locData = Loc.Load("Localization.csv")

但我不知道哪种数据结构最适合这个问题以及如何以最优雅的方式在 F# 中构造结果。然后我想用 C# 阅读这个结构。

有什么想法吗?

最佳答案

使用类型提供程序,您可以轻松实现以下目标:

open FSharp.Data

type Loc = CsvProvider<"Localization.csv">

let myMap = Loc.Rows |> Seq.map (fun r -> r.Key, r) |> Map.ofSeq

// accessing translations:
let trans1 = myMap.["some key"].Language1
let trans2 = myMap.["some key"].Language2

这里映射中每一行的类型是由类型提供程序生成的,在不同库之间传递结果时可能会造成麻烦。

另一方面,FSharp.Data模块中还有另一个处理CSV文件的工具,即CsvFile :

open FSharp.Data

let csv = CsvFile.Load("Localization.csv")
// To use the dynamic operator '?'
open FSharp.Data.CsvExtensions
// For Dictionary
open System.Collections.Generic

let myMap2 = csv.Rows |> Seq.map (fun r -> r?Key, r) |> Map.ofSeq 
let dict  = Dictionary(myMap2)

现在你有了一个 Dictionary<string,CsvRow> 类型的字典可以通过以下方式访问:

dict.["some key"].["Language1"]

关于csv - F# - CSV 到两键字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34291212/

相关文章:

python - 使用 Python pandas 通过公用键合并多个 tsv 文件

python - 在 Python 中使用 mdbtools 从 .mdb 文件中提取和排序数据

F# - 在 curried 函数参数上设置类型注释

f# - 我如何在 F# 中编写经典的高/低游戏?

python - 如何通过命令行填充 csv 文件中的新列

arrays - 将json文件转换为linux jq命令格式的csv

mysql - 如何在不将 csv 保存到磁盘的情况下将 csv 格式的数据从内存发送到数据库?

f# - 试图理解推断的类型约束

F# 计算表达式 : How to use `for` to return a `seq` ?

powershell - 导入 Csv Powershell