Страницы

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

понедельник, 17 декабря 2018 г.

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

Есть 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" ?


Ответ

Если строки в файлах уже отсортированы, то задача значительно упрощается.
Воспользуемся итераторами:
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]. Также, желательно, использовать компаратор, который был использован при сортировке строк, размещенных в файлах, так как разные компараторы могут давать разный результат [Сортировка массивов русских символов и строк с участием буквы Ё].

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

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