es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Fusionar dos archivos con diferentes tipos de objetos (pacientes y direcciones)

Tengo dos archivos:

  • patient.json: los propios pacientes
  • address.json: direcciones de los pacientes

Cada dirección de paciente contiene su ID de paciente.

patients.json:

{
  "id": 1,
  "name": "name1"
}
{
  "id": 2,
  "name": "name2"
}

patient_address.json:

{
  "patient_id": 1,
  "city": "city1-1",
  "town": "town1-1"
}
{
  "patient_id": 1,
  "city": "city1-2",
  "town": "town1-2"
}
{
  "patient_id": 2,
  "city": "city2-1",
  "town": "town2-1"
}

Mi resultado deseado sería:

{
  "id": 1,
  "name": "name1",
  "address": [
    {
      "city": "city1-1",
      "town": "town1-1"
    },
    {
      "city": "city1-2",
      "town": "town1-2"
    }
  ]
},
{
  "id": 2,
  "name": "name2",
  "address": [
    {
      "city": "city2-1",
      "town": "town2-1"
    }
  ]
}

¿Alguna idea?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, tengo una idea de cómo combinar y unir los dos archivos usando jq. Aquí está cómo hacerlo:

    1. Primero, necesitamos unir los dos archivos utilizando el campo patient_id. Podemos lograr esto ejecutando el siguiente comando jq:

    jq -s 'group_by(.patient_id) | map(reduce .[] as $item ({}; . + $item))' patient.json patient_address.json

    Este comando agrupará el archivo patient_address.json por el campo patient_id y luego fusionará cada grupo con el paciente correspondiente del archivo patient.json.

    1. A continuación, necesitamos formatear la salida para que coincida con el resultado deseado. Podemos lograr esto ejecutando el siguiente comando jq:

    jq '{id: .id, name: .name, address: [{city: .city, town: .town}]}'

    Este comando formateará cada paciente fusionado en el formato de salida deseado, con los campos id y name del paciente, y un array de objetos de dirección.

    Juntando todo, el comando final se vería así:

    jq -s 'group_by(.patient_id) | map(reduce .[] as $item ({}; . + $item)) | .[] | {id: .id, name: .name, address: [{city: .city, town: .town}]}' patient.json patient_address.json

    Este comando producirá la salida deseada:

    {
      "id": 1,
      "name": "name1",
      "address": [
        {
          "city": "city1-1",
          "town": "town1-1"
        },
        {
          "city": "city1-2",
          "town": "town1-2"
        }
      ]
    },
    {
      "id": 2,
      "name": "name2",
      "address": [
        {
          "city": "city2-1",
          "town": "town2-1"
        }
      ]
    }
    

Comments are closed.