@burov0798
Пытаюсь изучать php\js

Как найти расхождения строк в двух txt файлах?

Добрый день. Имеется 2 txt файла, один как основной, который весит около 100мб, в нем строки вида:

111111;dflgkdkfg
222222;DFLKDFG
33333;dfgdfgdfgdfg


и второй, с таким же видом строк. Нужно найти строки, которые совпадают с строками первого файла. Проблема в том, что строки искать нужно только по совпадению до знака " ; ", если таковые есть, их нужно записать в отдельный файл.

Мой код:
with open('some_file_1.txt', 'r') as file1:
    with open('some_file_2.txt', 'r') as file2:
        same = set(file1).intersection(file2)

same.discard('\n')

with open('some_output_file.txt', 'w') as file_out:
    for line in same:
        file_out.write(line)


Но проблема в том, что он сверяет строку полностью, и если такая строка есть в 1 файле - записывает ее, а нужно, чтобы сверял до знака ; и если такая строка есть, то записывал ее полностью уже. То есть:

1 файл:
111111;dflgkdkfg
222222;DFLKDFG
33333;dfgdfgdfgdfg


2 файл:
555555;dflgkdkfg
222222;fgdfgdfgdfgdfgdfgdfg
4444444;dfgdfgdfgdfg


и вывести должно это:

222222;DFLKDFG

Можно конечно открывать второй файл, читать его построчно, разделять строку по разделителю и потом открывать первый файл и так же построчно пробегаться по нему и искать текст в каждой строке, но думаю это будет не рационально, и когда строк будет много, придется же открывать каждый раз первый файл и пробегаться пока не закончатся строки во втором файле, думаю на это много времени уйдет, не так ли?
  • Вопрос задан
  • 118 просмотров
Решения вопроса 2
mayton2019
@mayton2019
Bigdata Engineer
Ты правильно сделал что преобразовал все строки файла в set.

Там есть готовый метод
set.difference(...)
который твою задачу решает. Только надо строки файла преобразовать. Удалить все символы что находятся до ";"
Ответ написан
@dmshar
lt_1=['111111;dflgkdkfg','222222;DFLKDFG','33333;dfgdfgdfgdfg','4444444;xxxxxxxxx','666666;ttt']
lt_2=['555555;dflgkdkfg','222222;fgdfgdfgdfgdfgdfgdfg','4444444;dfgdfgdfgdfg','555555;yyy']
lt_3=[]
for unit1 in  lt_1:
    for unit2 in  lt_2: 
        if unit1.split(';')[0]==unit2.split(';')[0]:
            lt_3.append(unit1)
print(lt_3)


Результат:
['222222;DFLKDFG', '4444444;xxxxxxxxx']

Перед этим фрагментом читаете оба файла (100МВ - это ни о чем), заполняя lt_1 и lt_2 после этого фрагмента - записываете lt_3 в файл.

P.S.
Можно еще и так:
lt_22=[unit2.split(';')[0] for unit2 in lt_2]
for unit1 in  lt_1:
    if unit1.split(';')[0] in lt_22:
        lt_3.append(unit1)


Или даже так:
lt_22=set([unit2.split(';')[0] for unit2 in lt_2])

Результат во всех трех реализациях одинаков, а вот что быстрее - надо проверять.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы