Я думаю, что все варианты будут разумными - это зависит от того, насколько сложным будет файл.Если экранирования нет, вы, вероятно, можете просто найти =
в строке и использовать его, чтобы разбить строку на пару ключ-значение.Если синтаксис более сложный, это может не всегда работать.
Мой предпочтительный метод - использовать Split
в строке - тогда вы можете filter
найти значения с требуемым ключом, map
чтобы получить значение и использовать Seq.head
, чтобы получить значение:
["foo=bar"]
|> Seq.map (fun line -> line.Split('='))
|> Seq.filter (fun kvp -> kvp.[0] = "foo")
|> Seq.map (fun kvp -> kvp.[1])
|> Seq.head
Используя активные шаблоны, вы можете определить шаблон, который принимает строку и разбивает ее, используя =
в список:
let (|Split|) (s:string) = s.Split('=') |> List.ofSeq
Затем можно получить значение, используя Seq.pick
с сопоставлением с шаблоном, который ищет строки, в которых подстрока до =
равна, например, foo
:
["foo=bar"] |> Seq.pick (function
| Split ["foo"; value] -> Some value
| _ -> None)
Активный шаблонхитрость довольно изящна, но это может излишне усложнить код, если вам нужно только это в одном месте.