Через равные промежутки времени мы получаем файлы CSV из внешнего источника, который мы почти не контролируем. Эти файлы представляют собой полные наборы текущих записей; однако, любые записи, которые были удалены с момента предыдущего, отсутствуют. Мы хотели бы сравнить два файла и создать отдельный файл удаленных записей, чтобы мы могли выполнить дополнительную обработку для них. В приложении в другой области у нас есть коммерческий пакет сортировки (CoSort), который делает это «из коробки»; однако, у нас нет доступа к этому здесь. Тем не менее, объемы не такие большие, и кажется, что это то, с чем стандартные или бесплатные инструменты могут справиться довольно легко. В идеале это может быть в форме пакетного файла Windows, но решения на Perl или awk тоже подойдут. Пример входных файлов:
Предыдущий файл:
X_KEY,X_NAME,X_ATTRIBUTE
123,Name 123,ATT X
111,Name 111,ATT X
777,Name 777,ATT Y
Входящий файл:
X_KEY,X_NAME,X_ATTRIBUTE
777,Name 777,ATT Y
123,Name 123,ATT CHANGED
Результирующий файл должен быть как минимум:
111,Name 111
Но если атрибуты из удаленных записей также проходят, это нормально.
До сих пор у меня есть пакетный файл, который использует бесплатную CMSort для сортировки двух файлов без записи заголовка, чтобы упростить процесс различного типа:
REM Sort Previous File, Skip Header
C:\Software\CMSort\cmsort.exe /H=1 x_previous.txt x_previous_sorted.txt
REM Sort Incoming File, Skip Header
G:\Software\CMSort\cmsort.exe /H=1 x_incoming.txt x_incoming_sorted.txt
Но бит "сравнивать и показывать только пропущенные записи из первого файла" ускользает от меня. Отчасти сложность заключается в том, что среди оставшихся записей могут меняться многочисленные атрибуты, поэтому это не просто разница. Однако это похоже на специализированную команду diff, ограничивающуюся проверкой только ключевого поля, а не всей записи. Я не могу получить правильный синтаксис, хотя. Идеи? Количество записей не должно превышать 50 000 записей.
Примечание. Если бы это был SQL, а данные находились в таблицах, мы могли бы использовать оператор EXCEPT , но в этом случае перемещение данных в базу данных не является возможным.