Самый эффективный по времени способ согласования данных csv/xlsx, преобразованных между схемами?

Итак, мои коллеги конвертируют данные из старой системы в новую, что предполагает небольшие изменения в схеме. Моя работа состоит в том, чтобы убедиться, что происходит согласование и что никакие данные не были повреждены или потеряны, а затем потом показать данные в Excel, чтобы можно было вручную увидеть, какие строки не удалось согласовать и почему. В основном просто изменяются имена столбцов или исключаются столбцы, поэтому очень легко сравнить одну запись с другой — всего лишь пара основных операторов if — но проблема заключается в том, чтобы сделать это быстро.

Мне нужно сопоставить записи в таблицах (OldSchema и NewSchema) по их идентификаторам, поэтому мне нужно каждый раз искать в старой схеме соответствующий идентификатор (который может не существовать - я также проверяю, не потеряны ли данные), и затем выполните проверки if для десятков тысяч строк. Я пробовал несколько способов сделать это как с помощью OfficeScripts, так и с Pandas, но каждый раз это было невероятно медленно, и я знаю, что, должно быть, делаю что-то глупое, потому что никогда раньше не работал с большими объемами данных.

Мне нужно идти по строкам, а затем сравнивать столбец за столбцом, а также могут существовать дополнительные бизнес-правила (т. е. обычно значения должны быть идентичными, но иногда значение «Премиум» для столбца X в старой схеме должно соответствовать «Супер Premium» для эквивалента столбца X в Новой схеме). Я не мог понять, как выполнять подобные проверки в DataFrame Python Pandas без использования iterrows(), который был даже медленнее, чем следующий, и имел свои собственные проблемы, поэтому вместо этого я попытался просто сохранить все это в Excel. Следующий код представляет собой сильно сокращенную и измененную версию того, что я сделал: преобразовал обычный формат Excel «Список списков» в список объектов, а затем перебрал эти объекты и сравнил ключи.

      function main(workbook: ExcelScript.Workbook) {
    const start = Date.now();


    const formattedOldTable = getAsListOfObjects(workbook.getTable("OldTable"));
    const formattedNewTable = getAsListOfObjects(workbook.getTable("NewTable"));

    for (const entry of formattedNewTable) {
        const oldEntry = formattedOldTable.find((oldEntry) => oldEntry["Id"] == entry["Id"]);
        const match = checkMatch(entry, oldEntry);
        if (match) {
            // mark this on the table
        }
    }
}

function checkMatch(newEntry: newSchema, oldEntry: OldSchema) {
    let match = true;
    if (!oldEntry) {
        return false;
    }
    if (newEntry["ColumnName"] !== oldEntry["SlightlyAlteredColumnName"]) {
        match = false;
    }
    // ...
    return match;
}

Это настолько медленно даже с таблицами, состоящими из нескольких десятков тысяч строк, что я считаю, что я совершенно не на то дерево. Я опубликовал это только для того, чтобы показать, что на самом деле я пытался найти свои собственные решения, прежде чем спрашивать - мой вопрос в том, какой язык/метод мне следует использовать? Как следует проводить такие базовые примирения? Google не помог, только показал мне, как я могу сравнить две таблицы, если они полностью идентичны, или найти разницу между ними, но я хочу отметить построчно, совпала ли запись, а если нет, то почему.

0 ответов

Другие вопросы по тегам