Самый эффективный по времени способ согласования данных 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 не помог, только показал мне, как я могу сравнить две таблицы, если они полностью идентичны, или найти разницу между ними, но я хочу отметить построчно, совпала ли запись, а если нет, то почему.