Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Сравнение двух .txt

#c_sharp


Есть 1.txt и 2.txt
в каждом есть около 10КК+ строк, но == длинны. Каким методом можно максимально быстро
найти одинаковые строки из 1.txt во втором, то есть найти те строки из 2.txt, которые
будут также в 1.txt 

1.txt
1 2 3 4 5 6 7  (пробел типа энтера)

2.txt
9 0 9 9 9 1 


значит во втором только одно совпадение есть "1" ?
    


Ответы

Ответ 1



Если строки в файлах уже отсортированы, то задача значительно упрощается. Воспользуемся итераторами: var s1 = File.ReadLines("1.txt"); // Обратите внимание не ReadAllLines, var s2 = File.ReadLines("2.txt"); // а ReadLines using (var en1 = s1.GetEnumerator()) // Берем using (var en2 = s2.GetEnumerator()) // итераторы { if (en1.MoveNext() && en2.MoveNext()) { while (true) { var w1 = en1.Current; // Берем по var w2 = en2.Current; // элементу var comp = w1.CompareTo(w2); if (comp == 0) // Нашли совпадение Console.WriteLine(w1); if (comp <= 0) // Выбираем какой из указателей сдвинуть if (!en1.MoveNext()) break; // Выход если нечего больше брать if (comp >= 0) if (!en2.MoveNext()) break; } } } Тоже самое, но работаем с потоками явно: using (var sr1 = new StreamReader("1.txt")) using (var sr2 = new StreamReader("2.txt")) { var w1 = sr1.ReadLine(); var w2 = sr2.ReadLine(); while (w1 != null && w2 != null) { var comp = w1.CompareTo(w2); if (comp == 0) Console.WriteLine(w1); if (comp <= 0) w1 = sr1.ReadLine(); if (comp >= 0) w2 = sr2.ReadLine(); } } Примечания: При сравнении строк много нюансов и если CompareTo вернул 0, то есть ненулевая вероятность того, что Equals или == покажут что строки не равны [Албахари, C# 6.0 Справочник: Полное описание языка, стр. 292]. Также, желательно, использовать компаратор, который был использован при сортировке строк, размещенных в файлах, так как разные компараторы могут давать разный результат [Сортировка массивов русских символов и строк с участием буквы Ё].

Комментариев нет:

Отправить комментарий