Есть ли способ сравнить CSV в Python, игнорируя порядок строк? - PullRequest
0 голосов
/ 29 мая 2020

Я настраиваю автоматическое c задание, которое должно анализировать файлы csv с ftp-сайта, каждый файл содержит несколько 10 тысяч строк. Я хочу предварительно обработать каталог, чтобы удалить повторяющиеся файлы, прежде чем анализировать оставшиеся файлы. Проблема в том, что дублирующиеся файлы отправляются на ftp, но с другим порядком строк (т. Е. Те же данные, другой порядок). Это приводит к "дублированным файлам", имеющим разные хеши и побайтовое сравнение. с минимальной обработкой.

Я хочу свести манипуляции с файлами к минимуму, поэтому я попытался отсортировать CSV с помощью модуля csvsort, но это дает мне ошибку индекса: IndexError: list index out of range. Вот соответствующий код:

from csvsort import csvsort
csvsort(input_filename=file_path,columns=[1,2])

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

Я могу придумать несколько способов решения этой проблемы, но все они будут включать открытие CSV и чтение содержимого. , манипулируя им, et c. Могу ли я провести легкое сравнение файлов, игнорирующее порядок строк, или мне придется go для более тяжелой обработки?

Ответы [ 2 ]

0 голосов
/ 01 июня 2020

Итак, оказывается, что pandas имеет встроенную функцию ha sh с возможностью игнорировать индекс. Поскольку ha sh вычисляется в каждой строке, вам необходимо запустить дополнительную функцию суммы. С точки зрения кода, он примерно такой же легкий, как я мог бы sh, с точки зрения времени выполнения он анализирует ~ 15 файлов за ~ 5 секунд (~ 30 тыс. Строк, 17 столбцов в каждом файле).

from pandas import read_csv
from pandas.util import hash_pandas_object
from collections import defaultdict

duplicate_check = defaultdict(list)
for f in files:
    duplicate_check[hash_pandas_object(read_csv(f),index=False).sum()].append(f)
0 голосов
/ 30 мая 2020

Вы не указываете, сколько данных у вас есть. Мой взгляд на это будет зависеть от размера. Мы говорим о сотнях строк? Или многомиллионные строки?

Если у вас "несколько" строк, вы можете легко отсортировать их. Но если данные становятся длиннее, вы можете использовать другие стратегии.

Ранее я решил проблему «отсечения строк из файла A, которые появляются в файле B» с помощью AWK, поскольку AWK может сделать это с помощью всего 1 просмотр длинного файла (A), что делает процесс чрезвычайно быстрым. Однако вам может потребоваться вызвать внешнюю программу. Не уверен, что это идеально для вас.

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

Если вы выберете go таким образом, сценарий будет чем-то рядом:

FNR==NR{
a[$0]++;cnt[1]+=1;next
}

!a[$0]

Использовать с

c:\path\to\awk.exe  -f awkscript.awk   SMALL_LIST   FULL_LIST  > DIFF_LIST

DIFF_LIST is элементы из ПОЛНОЙ, НЕ НАЛИЧИЕ МАЛЫХ.

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