Я разрабатываю приложение, которое будет считывать данные с нуля или более файлов CSV, которые я буду называть «внешними» данными. Приложение будет поддерживать производные («внутренние») данные в своих собственных (SQLite) таблицах, связанных с «строками» (строками) во внешних данных, чтобы пользователь мог вставлять, удалять или изменять строки, а полученные данные все равно будут связанных с одной и той же строкой. Если внешние данные были таблицей Postgres, я мог бы использовать OID строки, чтобы связать/соединить «внешний» с «внутренними» данными. Существует соответствие 1: 1 между внутренними и внешними строками.Haskell: обнаружение изменений в неконтролируемом CSV-файле
Поэтому, когда приложение запускается, оно будет читать внешний файл. Если строка удалена, соответствующая внутренняя строка будет удалена. Если строка добавлена, во внутренние данные будет добавлена новая строка. Если строка была изменена, внутренние данные останутся неизменными. Во внешних данных нет «ключевого» поля, которое можно считать не измененным.
Теперь это немного эвристически, но, как я уже сказал, я хотел бы обнаружить CRUD во внешнем CSV, поэтому я думал, что нужно вычислить 256-битный CRC-отпечаток для каждой внешней строки, и сохраните это во внутренней таблице SQLite. Затем, когда приложение запускается, оно имеет как внутренний, так и внешний [Integer], который может сравниться как программа GNU/Unix/Linux diff для обнаружения незначительных изменений во внешнем файле. Мне нужны две отдельные таблицы: я хочу разрешить пользователям поставлять «внешний» CSV и изменять его, но я хочу контролировать, что находится во внутренней таблице.
Я ожидаю, что внешние данные будут иметь порядок нескольких сотен строк; скажем, 1000 не более.
Итак, мой вопрос: есть ли библиотека, которая бы эвристически сравнивала два отпечатка пальца [Integer] и выводит минимальный список различий с точки зрения добавления, удаления и изменения? или что-нибудь в этом направлении?
В качестве дополнительного было бы неплохо иметь относительно стабильный алгоритм отпечатков пальцев; то есть тот, чей выход слегка изменился с слегка измененным входом, но это менее важно, чем основной вопрос, описанный выше.
Спасибо, но я должен был бы поддержать переупорядочение. Как я уверен, вы хорошо осведомлены, что не сообщают, что сделают пользователи. ;-) – Michael
@Michael. Я не верю, что существует существующий пакет для создания наборов diff, поэтому вам придется писать этот код самостоятельно. Первая часть моего совета стоит. В отчетах о опыте с помощью [бумеранга] (http://www.seas.upenn.edu/~harmony/) вы можете установить максимальный порог, по которому две записи никогда не будут выровнены. Если на CSV-файле отсутствуют какие-либо дополнительные данные, связанные с каждой записью, вы также должны просто заменить вашу базу данных в памяти, не пытаясь обмануть. –
Интересно, правильно ли этот пакет был полезен для сообщества. – Michael