Как протестировать программу обработки больших объемов данных, хранящихся в непредсказуемом формате

Что мне нужно сделать

Я пытаюсь манипулировать некоторыми довольно большими объемами данных, хранящимися в файлах Excel (одна из книг имеет до 150 таблиц). Результатом этих манипуляций может быть около 800 000 строк в таблице базы данных.

Проблема

Данные, хранящиеся в электронных таблицах, имеют непредсказуемый формат. Компания, создавшая эти электронные таблицы, не имела фиксированного / документированного формата для экспорта этих файлов, и иногда появляются ошибочные данные. Например, большинство лет представлено как «2009», но есть случаи, когда год представлен как «20». В другом примере данные в этих файлах не нормализованы, поэтому я использую разделители для разделения значений определенных ячеек. Иногда эти разделители меняются.

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

Вопрос

Как можно проверить правильность программы в такой ситуации? Вернее, как добиться довольно стабильной версии продукта, не запуская его по всем доступным данным?

Должен ли я использовать защитный подход и исключать исключения, когда возникает какая-то неожиданная проблема? Тогда основной цикл программы может ловить их и записывать в них и продолжать доступ к имеющимся данным? Это даст некоторые обработанные данные, но это означает, что на последующей итерации программы я должен иметь проверки того, что уже находится в базе данных из предыдущих итераций (что мне не очень нравится).

Каково ваше мнение? Как бы вы справились с этой проблемой?

Если нет спецификации того, какой формат данных, то все приемлемо.

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

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

Overfitting – это общая концепция машинного обучения, но она полезна для других задач, таких как эта – разработка программы. Удивительно, как разработчики могут написать кучу единичных тестов, закодировать их приложение, чтобы хорошо работать на нем, а затем ожидать аналогичной или безошибочной производительности в производстве.

Если вы не хотите предпринимать все эти шаги (т. Е. Запускаете свой код по существу во всех данных), поскольку набор тестов также использует данные), я бы сказал, что задача слишком велика.

Вместо того, чтобы создавать определение формата, очень странного и своеобразного для учета всех «ошибок» в текущих данных, вы можете создать новый, нормализованный (в том смысле, что эти вещи упрощены) спецификации для данных, а затем написать «ошибочный патч для документов», который может быть запущен на дефектных документах для исправления данных.

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

Скорее всего, я предполагаю, что разработчики программного обеспечения давно прошли, никто больше не понимает код, даже если он вообще работает.

Как можно проверить правильность программы в такой ситуации? Вернее, как добиться довольно стабильной версии продукта, не запуская его по всем доступным данным?

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

Чтобы привести пример в дате, которую вы дали, изначально у даты было бы ограничение, что это могло бы быть только четыре цифры. Когда программа натолкнулась на «20», это вызовет исключение. Затем вы можете пойти и разрешить двухзначные даты, а также метод преобразования двузначных дат в четырехзначный для дальнейшей обработки.

Один вопрос: вы будете запускать свою программу более одного раза? Из вашего вопроса кажется возможным, что вы только хотите запустить его один раз, а затем вы будете работать с данными в базе данных.

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

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

Обычно для такого рода вещей я делаю это, как предложил @MarkJ, и я кодирую все это в модульных тестах.

Поэтому я составляю небольшой файл данных, который сначала содержит только несколько строк обычных данных. Это единичный тест №1.

Затем я быстро просматриваю некоторые данные, чтобы выявить все очевидные исключения. Модульные тесты с 2 по n.

Наконец, я пишу код парсера до тех пор, пока он не пройдет все модульные тесты, а также исключает и регистрирует исключения для всех не управляемых данных.

Затем я использую эти нечетные бит данных для создания новых модульных тестов и улучшаю парсер до тех пор, пока он не сможет их передать.

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

Как насчет обработки каждой части данных (так что вам не нужно проверять наличие обмана). Те, кто проходит, входят в базу данных. Исключения переходят в файл исключений. Пользователь может открыть файл исключения и внести исправления / изменения в данные. Затем они могут запускать вашу программу в файле исключений.

Это позволит изолировать необработанные данные, чтобы пользователь мог исправить и не разрешать вам обрабатывать одни и те же данные дважды (или более).

Interesting Posts

Выключение макроса Countif с помощью ссылки на подстановочную ячейку

Excel несколько вложенных, если и условия неоднократно повторялись

VBA работает только на определенном листе

Excell – массив, связанный со смещением ячейки

Макрос VBA для копирования кода ошибки SQL в Excel

ezPyCrypto для шифрования файла MS Excel

Значение диапазона Excel VBA иногда не позволяет выполнить проверку сравнения

Как записать строчную букву в Excel

ScreenUpdating не работает при открытии файла

Добавить индекс в тексте ячейки с помощью Apache POI Java

Определение того, какой год продукт запускается на основе массива продаж в географических регионах

Нулевые значения в первом столбце предотвращают импорт файлов Excel в Pentaho Spoon?

Вставить Специальная ошибка 1004 ВставитьСпециальный метод класса Range не выполнен

Удалять строки, если столбец в файле1 попадает в пределах диапазона, объявленного в двух столбцах в другом файле

Динамическая диаграмма Excel

Давайте будем гением компьютера.