2

Я хочу выяснить различия 2 (или 3 файла, если это возможно) построчно. Утилиты Diff могут сделать это, однако это дает неточные результаты. Потому что 2 файла имеют точное количество строк, равное "134". Но diff дает мне "Добавленные линии" и "Удаленные линии". Однако это неправильно, они имеют одинаковое количество строк, нет добавленных или удаленных строк.

В текстовых файлах, в которых я хочу найти различия, написаны только цифры, может быть, поэтому этот алгоритм не работает. Я не мог найти какой-либо вариант, чтобы предотвратить это, хотя я могу ошибаться, я имею в виду, что должен быть вариант, но, опять же, я не смог найти.

Это то, что я получаю (5 утра. Текст против 6 часов, есть огромная проблема):http://img26.imageshack.us/img26/7049/wrongp.png

Это то, что я хочу (6 утра.txt против 7 утра. Txt, все еще есть проблемы):http://img402.imageshack.us/img402/5421/semiright.png

Редактировать:

После того, как я понял, что для этого нет утилиты, я справился сам. Я почти сделал то же самое, что и RedGrittyBrick. Этот скрипт имитирует утилиту diff, поэтому я (или вы) можете использовать ее с diff2html.

Чтобы использовать его с diff2html, просто измените строку

diff_stdout = os.popen("diff %s" % string.join(argv[1:]), "r")

в

diff_stdout = os.popen("script.py %s" % string.join(argv[1:]), "r")

и назовите этот скрипт как хотите (для запуска требуется Python 2.x , например diff2html):

import sys

f1=open(sys.argv[1],"r")
f1_read=f1.readlines()
f1.close()
f2=open(sys.argv[2],"r")
f2_read=f2.readlines()
f2.close()

changed={}
first_c = ""
for n in range(len(f1_read)):
    if f1_read[n]!=f2_read[n]:
        if first_c == "":
            first_c=n+1
        changed[first_c]=n+1
    else:
        first_c=""

#Let's imitate diff-utils...

for (x, y) in changed.items():
    print "%d,%dc%d,%d" % (x,y,x,y)
    for i in range(x,y+1):
        sys.stdout.write("< %s" % f1_read[i-1])
    print "---"
    for i in range(x,y+1):
        sys.stdout.write("> %s" % f2_read[i-1])

Окончательные результаты:

2 ответа2

3

diff предполагает, что второй файл мог быть создан не только путем редактирования строк, но и путем вставки и удаления строк.

Если вы просто хотите узнать, какие строки различаются без учета вставленных или удаленных строк, вы можете использовать более простой подход.

$perl d.pl a b | less
  1:   255,   107 DIFFERENT!
  2:   197,   148 DIFFERENT!
  3:   113,   165 DIFFERENT!
  4:     0,   221 DIFFERENT!
  5:     0,   153 DIFFERENT!
  6:     0,    85 DIFFERENT!
  7:    48,   255 DIFFERENT!
  8:    61,   187 DIFFERENT!
  9:    63,    85 DIFFERENT!
 10:     3,     0 DIFFERENT!
 11:    49,     0 DIFFERENT!
 12:    58,    15 DIFFERENT!
 13:    47,     0 DIFFERENT!
 14:    62,     0 DIFFERENT!
 15:    61,     0 DIFFERENT!
 16:   255,   255 same
 17:   255,   255 same
 18:   255,   255 same
 19:   255,   255 same
 20:   255,   255 same
 21:   255,   255 same

где д.пл

#!/usr/bin/perl
use strict;
use warnings;

open my $f1, '<', $ARGV[0] or die "Can't read '$ARGV[0]' - $!\n";
open my $f2, '<', $ARGV[1] or die "Can't read '$ARGV[1]' - $!\n";

while (my $f1_line = <$f1>) {
  my $f2_line = <$f2>;
  chomp for $f1_line, $f2_line;
  my $verdict = $f1_line eq $f2_line ? 'same' : "DIFFERENT!";
  printf "%3d: %5d, %5d %s\n", $., $f1_line, $f2_line, $verdict;
}

close $f2;
close $f1;
2

Для сравнения файлов мой любимый инструмент - Notepad++.

После его установки на панели инструментов нажмите Плагины> Диспетчер плагинов> Доступно и проверьте Сравнение и установка.

После перезапуска Notepad++ откройте два файла (они откроются на разных вкладках) и на панели инструментов перейдите в раздел Плагины> Сравнить> Сравнить.

Вы можете сделать несколько настроек, но сравнение файлов выглядит примерно так:

где белый текст неизменен, красный удален, зеленый добавлен, а на боковой панели представлен обзор этих изменений в двух файлах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .