我有具有以下结构的本地化 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/