Объединение определенных строк из 2 файлов при отсутствии данных в одном из них.

Вопрос или проблема

У меня есть два очень длинных файла JSON, и моя цель — получить объединенный файл, в котором данные, отсутствующие в одном из них, будут скопированы/переписаны в другом.

Вот пример.

ФАЙЛ1:

"27:10": {
    "questID:3": 27,
        "completed:9": {},
        "tasks:9": {
            "0:10": {
                "completeUsers:9": {},
                "userProgress:9": {},
                "index:3": 0,
                "taskID:8": "bq_standard:retrieval"
         }
     }
},
ФАЙЛ2:

"27:10": {
    "questID:3": 27,
    "completed:9": {
        "0:10": {
            "claimed:1": 1,
            "uuid:8": "UUID2",
            "timestamp:4": 1726327347588
        }
    },
    "tasks:9": {
        "0:10": {
            "completeUsers:9": {
                "0:8": "UUID2"
            },
        "userProgress:9": {
            "0:10": {
                "data:11": [
                    1
                ],
                "uuid:8": "UUID2"
            }
        },
        "index:3": 0,
        "taskID:8": "bq_standard:retrieval"
        }
    }
},

Чтобы дать немного понимания. Эти два примера из мода Minecraft под названием ‘Better Questing 2’, и два разных файла принадлежат двум разным пользователям. Мне кажется, это не имеет большого значения.

Что мне на самом деле хотелось бы сделать, так это зарегистрировать, что "questID:3": 27" завершен в файле 2, но не в файле 1, и затем переписать то, что написано в файле 1, данными из файла 2. Не так важно, чтобы UUID изменился с UUID2 на UUID1, поскольку это можно сделать с помощью простой ‘замены’. К сожалению, сам мод Minecraft не имеет такой функции, и, насколько я могу видеть, довольно ручной способ — единственный способ сделать это. Я просто не знаю, как заставить компьютер помочь мне с этими 40 000+ строками файлов JSON.

Некоторые более длинные примеры двух файлов можно увидеть на этих двух pastebin.
ФАЙЛ1:
https://pastebin.com/xgnmJb1h

ФАЙЛ2:
https://pastebin.com/WA8EZqEY

Ответ или решение

Чтобы объединить данные из двух json-файлов и при этом заполнить отсутствующие значения из одного файла в другой, можно воспользоваться языком программирования Python с библиотекой json. Ниже представлен шаги и пример кода, который позволит выполнить эту задачу.

Шаги:

  1. Загрузить json-данные из обоих файлов.
  2. Сравнить данные по ключам и проверить наличие необходимых значений.
  3. Обновить значения в первом файле данными из второго, если они отсутствуют.
  4. Сохранить изменённые данные обратно в первый файл.

Пример кода на Python:

import json

# Функция для загрузки json-файла
def load_json(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        return json.load(f)

# Функция для сохранения json-файла
def save_json(data, file_path):
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=4)

# Функция для объединения данных
def merge_json(file1_data, file2_data):
    for key in file2_data:
        # Проверяем, существует ли ключ в file1_data
        if key not in file1_data:
            # Если ключа нет, добавляем его из file2_data
            file1_data[key] = file2_data[key]
        else:
            # При наличии ключа, проверяем его содержимое
            for sub_key in file2_data[key]:
                if sub_key not in file1_data[key]:
                    file1_data[key][sub_key] = file2_data[key][sub_key]
                else:
                    # Если подключ уже есть, проверяем заполненность
                    for inner_key in file2_data[key][sub_key]:
                        if inner_key not in file1_data[key][sub_key] or not file1_data[key][sub_key][inner_key]:
                            file1_data[key][sub_key][inner_key] = file2_data[key][sub_key][inner_key]
    return file1_data

# Пути к файлам
file1_path = 'path/to/your/file1.json'
file2_path = 'path/to/your/file2.json'

# Загрузка данных из файлов
file1_data = load_json(file1_path)
file2_data = load_json(file2_path)

# Объединение данных
merged_data = merge_json(file1_data, file2_data)

# Сохранение объединенных данных обратно в file1
save_json(merged_data, file1_path)

Описание кода:

  • Функция load_json загружает json-файлы.
  • Функция save_json сохраняет изменённые данные обратно в json-файл с удобным форматированием.
  • Функция merge_json объединяет данные, проверяет наличие ключей и обновляет недостающие значения в первом файле данными из второго.
  • В завершение, после объединения, данные сохраняются обратно в файл 1.

Примечание:

После выполнения этого сценария вам достаточно будет выполнить поиск и замену UUID, если это необходимо, чем можно легко управлять с помощью простого текстового редактора или дополнительного кода.

Этот подход позволит вам автоматически обработать ваши файлы, не требуя ручного вмешательства даже при большом количестве данных.

Оцените материал
Добавить комментарий

Капча загружается...