F# 将CSV文件中的值合并到JSON结构中
我有一个相当大的JSON结构,需要使用CSV文件中的值进行更新 CSV文件中的每一行都包含要更新的对象id和字段名。我要更新的值可以嵌套 使用JsonTypeProvider读取JSON数据很容易,但如何在将值写入文件之前合并这些值 我不想创建一个与JSON结构匹配的类型并对其进行反序列化,因为它包含了太多我不感兴趣的值,但我需要它们都包含在最终结果中 这是我的节目:F# 将CSV文件中的值合并到JSON结构中,f#,f#-data,F#,F# Data,我有一个相当大的JSON结构,需要使用CSV文件中的值进行更新 CSV文件中的每一行都包含要更新的对象id和字段名。我要更新的值可以嵌套 使用JsonTypeProvider读取JSON数据很容易,但如何在将值写入文件之前合并这些值 我不想创建一个与JSON结构匹配的类型并对其进行反序列化,因为它包含了太多我不感兴趣的值,但我需要它们都包含在最终结果中 这是我的节目: type JsonFile = JsonProvider<"./myjson.json"> type CsvFile
type JsonFile = JsonProvider<"./myjson.json">
type CsvFile = CsvProvider<"./texts.csv">
[<EntryPoint>]
let main argv =
let jsonValues = JsonFile .GetSample().Result
let texts = CsvFile.GetSample().Rows
let result =
jsonValues
|> Seq.map(fun v ->
// I would like to merge values here
let texts = texts |> Seq.filter(fun t -> t.Id = string v.Id)
let description = texts |> Seq.tryFind (fun t -> t.FieldName = "Description")
if description.IsSome then
v.Description.["en"] <- description.Value.En // This doesn't work of course, just an example of what I would like to do
v.Description.["no"] <- description.Value.No
// etc etc
v.JsonValue
)
|> Seq.map(fun json -> json.ToString(JsonSaveOptions.DisableFormatting))
|> String.concat "\n"
let fileName = "./mergedvalues.ndjson"
File.WriteAllText(fileName,
result,
System.Text.Encoding.UTF8)
0
我的问题是,我的一些记录有很多字段,所以像这样使用构造函数非常不方便,有时甚至很难正确。有什么方法可以使用我现有的<代码> JsonProvider <代码>值来实例化该类型,只更新我想更新的字段? 对于这种情况,您应该考虑使用JSONValm属性属性,该属性基本上是一个字符串*JSONVALL数组。
然后,您可以匹配csv中定义的属性,并越来越深地更新(折叠)jsonvalue,并将其注入主构造函数(如果您没有重新定义它,则为Root)。为什么这不起作用
v.Description。[“en”]属性不可变似乎您的问题尚未解决::(无论如何,谢谢!
let newDescription =
JsonFile.Description(``type`` = v.Type,
no = v.Description.No,
en = Some "my new value",
fr = v.Description.Fr,
de = v.Description.De,
nl = v.Description.Nl)