簡體   English   中英

F#-CSV至兩鍵字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM