将CSV文件中的值合并到JSON结构中

时间:2019-05-20 13:52:01

标签: f# f#-data

我有一个很大的JSON结构,需要使用CSV文件中的值进行更新。

CSV文件中的每一行都包含要更新的对象的ID和字段名称。我要更新的值可以嵌套。

使用JsonTypeProvider读取JSON数据很容易,但是如何在将值写入文件之前合并这些值?

我不想创建一个与JSON结构匹配并反序列化的类型,因为它包含了许多我不感兴趣的值,但是我需要将它们全部包含在最终结果中。

这是我的程序:

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

如何更新JSON文件的值?

我看到JsonTypeProvider可能不适合做这种事情,我愿意接受任何建议。

更新

所以我发现我可以创建这样的新值:

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)

我的问题是我的某些记录具有很多字段,因此使用这样的构造函数确实很不方便,有时甚至很难正确。有什么方法可以使用现有的JsonProvider<...>值来实例化类型,并仅更新我想更新的字段?

1 个答案:

答案 0 :(得分:1)

在这种情况下,您应该考虑使用JsonValue Properties属性,该属性基本上是一个字符串* JsonValue数组。

然后,您可以匹配在csv中定义的属性,并越来越深地更新(折叠)您的jsonvalue并将其注入到主构造函数中(如果没有重新定义,则为root)。