Слияние значений из CSV-файла в структуру JSON - PullRequest
1 голос
/ 20 мая 2019

У меня довольно большая структура JSON, которую мне нужно обновить значениями из файла CSV.

Каждая строка в файле CSV содержит идентификатор обновляемого объекта и имя поля.Значения, которые я хочу обновить, могут быть вложенными.

Чтение данных JSON с JsonTypeProvider легко, но как я могу объединить значения перед записью их в файл?

Я не хочусоздать тип, который соответствует структуре 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 Ответ

1 голос
/ 21 мая 2019

В этом случае вам следует рассмотреть возможность использования свойства JsonValue Properties, которое в основном представляет собой строку * массив JsonValue.

Затем вы можете сопоставлять свойства, определенные в вашем CSV, и обновлять все глубже и глубже (складывать) ваше jsonvalue и вводитьэто в главный конструктор (Root, если вы его не переопределили).

...