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

192
17 августа 2017, 19:52

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

Answer 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();
    }
}

Примечания:

  1. При сравнении строк много нюансов и если CompareTo вернул 0, то есть ненулевая вероятность того, что Equals или == покажут что строки не равны [Албахари, C# 6.0 Справочник: Полное описание языка, стр. 292].

  2. Также, желательно, использовать компаратор, который был использован при сортировке строк, размещенных в файлах, так как разные компараторы могут давать разный результат [Сортировка массивов русских символов и строк с участием буквы Ё].

READ ALSO
Программно привязать/указать/изменить Script в Unity

Программно привязать/указать/изменить Script в Unity

Довольно недавно начал изучать UnityВсё шло довольно ровно и хорошо, пока не случилось это

234
DDD Одна Машина и разные модели

DDD Одна Машина и разные модели

Исходные условия: - У нас есть класс измерительного прибора (MeasureDevice)MeasureDevice является сущностью

210
Ошибка с неуправляемой памятью

Ошибка с неуправляемой памятью

Есть библиотека на c++ и документация к нейВ целом с ней могу работать, но с некоторыми функциями проблема

322
Преобразовать JSON строку в объект c# [дубликат]

Преобразовать JSON строку в объект c# [дубликат]

На данный вопрос уже ответили:

277