2014-01-11 2 views
-2

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

Примером может быть:

первый файл имеет

var1:var2:var3 

2-й будет иметь

var2:var3:var4 

Мне нужно соединить их в третий файл с выходом: var1:var2:var3:var4. Обратите внимание, что строки не совпадают, var4, которые должны идти с var1 (поскольку они имеют var2 и var3 вместе). Var2 и Var3 являются общими для Var1 и Var4. может быть далеко в этих огромных файлах. Мне нужно найти способ сравнить каждую строку и подключить ее к одному во втором файле. Кажется, я ничего не думаю о адекватной петле. Есть идеи?

+0

Как вы различать, когда две строки Имеете две или более записей («var _ _» в вашем примере)? По крайней мере один общий? – mojo

+0

Третий создаваемый файл должен быть в таком формате: var1: var2: var3: var4. Var2 и var3 являются общими для var1 и var3. Var2 и Var3 всегда объединяются в пары, поэтому, если один из них распространен, то другой. – user3184354

+0

Гарантировано ли, что 'var2' происходит только один раз в каждом файле? Является ли «пересечение» гарантией существования только один раз между двумя файлами? I.e., учитывая строку из файла1, существуют ли более чем одна строка, содержащая записи (например, 'var2' или' var4'), которые она содержит? – mojo

ответ

0

на основе конкретных полей, которые вы сказали, что вы хотите, чтобы соответствовать (2 & 3 из файла 1, 1 & 2 из файла 2):

#!/usr/bin/python3 

# Iterate over every line in file1. 
# Iterate over every line in file2. 
#  If lines intersect, print combined line. 

with open('file1') as file1: 
    for line1 in file1: 
     u1,h1,s1 = line1.rstrip().split(':') 

     with open('file2') as file2: 
      for line2 in file2: 
       h2,s2,p2 = line2.rstrip().split(':') 

       if h1 == h2 and s1 == s2: 
        print(':'.join((u1,h1,s2,p2))) 

Это чудовищно медленно (в теории), но использует минимум ОЗУ. Если файлы не являются абсолютно огромными, они могут не работать слишком сильно.

+0

Спасибо, это сработало отлично. – user3184354

1

Попробуйте следующее (в предположении, var2:var3 всегда уникальный ключ в обоих файлах):

  1. перебрать все строки в первом файле
    • Добавить все записи в dictionary со значением var2:var3 в качестве ключа (и var1 в качестве значения)
  2. Итерация по всем записям во втором файле
    • посмотрите, если словарь из части 1 содержит запись для ключа var2:var3, и если он выводит var1:var2:var3:var4 в выходной файл и удаляет запись из словаря.

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

0

Если память не проблема, использование словаря, где ключевым является такой же, как значение: «пересекаются»

#!/usr/bin/python 

out_dict = {} 

with open ('file1','r') as file_in: 
    lines = file_in.readlines() 
    for line in lines: 
     out_dict[line] = line 

with open ('file2','r') as file_in: 
    lines = file_in.readlines() 
    for line in lines: 
     out_dict[line] = line 

with open ('output_file','w') as file_out: 
    for key in out_dict: 
     file_out.write (key) 
+0

Этот текст записывает обе линии, которые пересекаются, и те, которые этого не делают. – user3184354

+0

Разве я вас неправильно понял? Любая строка будет отображаться только один раз: Если файл1 var1 var2 var3 и file2 является var2 var3 var4 выходной файл будет var1 var2 var3 var4. Разве это не то, о чем вы просили? –

Смежные вопросы