[英]F# - CSV to two keys dictionary
我具有以下結構的本地化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>
類型的Dictionary<string,CsvRow>
,可以按以下方式訪問它:
dict.["some key"].["Language1"]
首先: https : //msdn.microsoft.com/en-us/library/h6270d0z(v=vs.110).aspx
如果您需要這樣做,則可以擁有文件,並且可能會執行以下操作:
let translation key language =
let d =
locData
|> Seq.filter(fun x -> x.Key = key)
|> Seq.exactlyone
d.[language]
為了加快速度,請使用一些Map或其他工具:
let mapLocData =
locData
|> Seq.groupBy (fun x -> x.Key)
|> Map.ofSeq
let translation key language =
mapLocData.[key].[language]
... ... ISH
代碼根本沒有經過測試,僅在此處編寫等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.