Логика для сравнения файлов - PullRequest
4 голосов
/ 12 ноября 2009

Я пытаюсь написать программу для сравнения файлов. Например:

file1

1
2
3
4
5

file2

1
2
@
3
4
5

Если я делаю это построчно, я получаю:

1 == 1; 
2 == 2;
3 != @;
4 != 3;
5 != 4;
  != 5;

Но правда в том, что единственная разница между файлами - это @. Я хочу получить что-то вроде этого:

1 == 1;
2 == 2;
  != @;
3 == 3;
4 == 4;
5 == 5;

Какой лучший способ сделать это? без использования каких-либо внешних приложений, таких как diff, fc и т. д.

Ответы [ 5 ]

2 голосов
/ 12 ноября 2009

Интересно, поможет ли Расстояние Левенштейна в этой ситуации? Это даст вам представление о том, насколько похожи эти два файла, но я не знаю, можете ли вы сосредоточиться на @. Тем не менее, на что посмотреть.

1 голос
/ 28 марта 2012

Немного устарел, я полагаю :), но я наткнулся на этот пост, потому что искал справку по той же проблеме: у меня есть два файла, которые я отображаю рядом, и я должен отметить строки, не соответствует красному.

Мой - немного особый случай, потому что 1) порядок не важен, и 2) каждая строка гарантированно встречается только один раз (текст - файл лицензии с определениями, строка за строкой).

Оказалось, что самый простой способ сделать это - просто составить списки двух файлов, ls1 и ls2, и сделать следующее (в псевдокоде):

i = 0;
while (i < ls1.count) {
    n = ls2.find(ls1[i]);
    if (n >= 0) {
        // found match in ls2
        ls1.Delete(i);
        ls2.Delete(n);
    } else
        i++;
}

Объяснено, для каждой строки есть ls1, посмотрите, есть ли соответствующая строка в ls2. Если так, удалите оба. То, что у вас осталось, - это просто различия, и вы можете легко разметить эти строки в исходном тексте.

Чрезвычайно легко, без библиотек. Просто мои два цента ...

1 голос
/ 12 ноября 2009

Если вы не пишете программу для изучения алгоритмов различий, но просто ищете решение, попробуйте diff-match-patch . Он содержит реализации алгоритмов diff и patch на разных языках программирования (cpp, c #, java, javascript, python).

Я попробовал его Java-версию, и она работала как шарм.

1 голос
/ 12 ноября 2009

Python имеет очень удобную библиотеку для сравнения последовательностей, которая называется difflib . Базовый класс SequenceMatcher берет две последовательности Python и предоставляет вам (среди прочего) последовательность кодов операций, сообщающих вам, как вы будете переходить от первой последовательности ко второй (т.е. различия). Они имеют форму:

  • Замените этот блок на этот
  • Вставить блок
  • Удалить блок
  • Копировать блок (называемый «равным»)

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

1 голос
/ 12 ноября 2009

Я считаю, что вы ищете расстояние между двумя строками, возможно , это может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...