Мне постоянно нужно сравнивать пары текстовых файлов с фиксированной шириной, которые меняются на определенных позициях символов. Эти файлы обычно имеют одну строку и фиксированное количество байтов, поэтому большинство инструментов сравнения помечают всю строку как другую, но не указывают, какие символы являются конкретными, которые отклоняются.
Есть ли какой-нибудь инструмент, специализированный для такого рода файлов? Я могу найти только линейные инструменты. Я не против платформы, на которой работают инструменты.
С помощью пары строк python вы можете сделать это:
Python предустановлен в большинстве установок OS-X и Linux, может быть установлен на остальных с помощью apt-get
и доступен для Windows.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
def diffline(l1, l2):
""" Difference a pair of lines."""
print("A:", l1.strip())
print("B:", l2.strip())
delta = [" "]
for n in xrange(min([len(l1), len(l2)])):
if l1[n] == l2[n]:
delta.append(' ')
else:
delta.append('^')
excess = abs(len(l1) - len(l2))
delta.append('^' * excess)
print("".join(delta))
def linedelta(fname1, fname2):
"""
Compare lines in two text files and mark the position of deltas.
"""
print("A =", fname1)
print("B =", fname2)
line_no = 0
l1 = "???"
l2 = "!!!"
with open(fname1, 'rt') as f1:
with open(fname2, 'rt') as f2:
while len(l1) and len(l2):
line_no += 1
l1 = f1.readline()
l2 = f2.readline()
if l1 <> l2:
print("Line:", line_no)
diffline(l1, l2)
if not len(l1) + len(l2):
print("Files differ after line", line_no)
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage:\n\tLineDelta.py file1 file2")
else:
linedelta(sys.argv[1], sys.argv[2])
Тест1.txt:
ABCABCABCABCABCABCABCABCABCABCABCABC
CBACBACBACBACBACBACBACBACBACBACBACBA
ABCABCABCABCABCABCABCABCABCABCABCABC
Тест2.txt:
ABCABCABCABCABCABCABCABCABCABCABCABC
CBACBACBACBACBACBACBACBACBACCACBACBA
ABCABCABCABCABCABCABCABCABCABCABCABC
Бег LineDelta.py Test1.txt Test2.txt
дает:
A = test1.txt
B = test2.txt
Line: 2
A: CBACBACBACBACBACBACBACBACBACBACBACBA
B: CBACBACBACBACBACBACBACBACBACCACBACBA
^
NB Возможны более быстрые, короткие и элегантные реализации, но я думаю, что приведенное выше, вероятно, более понятно.
Meld показывает, что вы изменили символы темно-синим цветом:
Измененная строка отображается голубым цветом, поэтому вы можете сначала увидеть строку, а затем символ.
Бесплатно, с открытым исходным кодом.
Николя Рауль
Лассе В. Карлсен