Предварительно сравните два или более CSV-файлов - PullRequest
0 голосов
/ 23 января 2019

Я просто изучаю Python, и, как все знают, лучший способ - это практика;) И теперь у меня есть работа, и я хочу попробовать сделать это на python, но мне нужен совет.

Ну ... у меня есть несколько файлов CSV. Структура выглядит так:

1-й CVS workerID, workerName, workerPhoneNumber

2-й и другие CSV содержат подмножество этого первого набора.

Я имею в виду, что в первом файле, например, 10 000 сотрудников, и в каждом из них есть раздел с теми же сотрудниками. Например: в первом файле у меня

00001 Randal 555555
00002 Tom 66666
00003 Anthony 77775
00004 Mark 3424435
00005 Anna 3443223
00006 Monica 412415415
.....

во втором файле:

00001 Randal 555555
00004 Mark 3424435
00006 Monica 412415415
....

и 3-й файл:

00001 Randal 555555
00004 Mark 3424435
00005 Anna 3443223
....

Я должен проверить достоверность всех пользователей во всех файлах. Я имею в виду: проверьте, чем у Анны, что все файлы имеют одинаковый идентификатор и телефон в других файлах и одинаковы для всех результатов (это огромные 100k строк файла). Тогда я верну все несоответствия. Проблема сложения заключается в некотором «NA» в строках.

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

РЕДАКТИРОВАТЬ: рабочие имеют уникальные имена :) Его случайная строка на самом деле не имя: D просто пример: D в идентификаторах одного файла тоже уникально

1 Ответ

0 голосов
/ 23 января 2019

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

header = ('id', 'name', 'phone_number')

records_1 = [{k:v for k, v in zip(header, line.strip().split(' ')} } for line in open('path_to_file1', 'r')]
records_2 = [{k:v for k, v in zip(header, line.strip().split(' ')} } for line in open('path_to_file2', 'r')]

Затем, если вы хотите проверить свои записи на основе имени пользователя, используйте словарь с именем в качестве ключа и записью в качестве значения.:

records_1 = {rec['name']: rec for rec in records_1}
records_2 = {rec['name']: rec for rec in records_2}

и проверьте каждое имя, если у вас есть дублированные идентификаторы.Если это так, сохраните его для вывода:

seen = {}
output = []
for records, others in [(records_1, records_2), (records_2, records_1)]:
    for name, rec in records:
        if name in seen:
            continue

        if rec['id'] != others['name']['id']:
            output.append((name, rec, others['name']))

Обратите внимание, что мы можем вывести список перестановок, используя перестановки из itertools: https://docs.python.org/3/library/itertools.html

Надеюсь, это поможет!

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