Ich muss ständig zwei Textdateien mit fester Breite vergleichen, die sich an bestimmten Zeichenpositionen ändern. Diese Dateien haben normalerweise eine einzelne Zeile und eine feste Anzahl von Bytes, sodass die meisten Diff-Tools die gesamte Zeile als unterschiedlich markieren, aber nicht angeben, welche Zeichen die spezifischen sind, die umleiten.
Gibt es ein Tool, das auf diese Art von Dateien spezialisiert ist? Ich kann nur zeilenweise Werkzeuge finden. Es ist mir egal, auf welcher Plattform die Tools laufen.
Mit ein paar Zeilen Python können Sie dies tun:
Python ist auf den meisten OS-X- und Linux-Installationen vorinstalliert, lässt sich auf den übrigen mit installieren apt-get
und ist für Windows verfügbar.
#! /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])
Test1.txt:
ABCABCABCABCABCABCABCABCABCABCABCABC
CBACBACBACBACBACBACBACBACBACBACBACBA
ABCABCABCABCABCABCABCABCABCABCABCABC
Test2.txt:
ABCABCABCABCABCABCABCABCABCABCABCABC
CBACBACBACBACBACBACBACBACBACCACBACBA
ABCABCABCABCABCABCABCABCABCABCABCABC
Laufen LineDelta.py Test1.txt Test2.txt
gibt:
A = test1.txt
B = test2.txt
Line: 2
A: CBACBACBACBACBACBACBACBACBACBACBACBA
B: CBACBACBACBACBACBACBACBACBACCACBACBA
^
NB Es sind schnellere, kürzere und elegantere Implementierungen möglich, aber ich denke, dass das obige wahrscheinlich verständlicher ist.
Meld zeigt dir veränderte Charaktere in tiefblau:
Geänderte Zeilen werden hellblau angezeigt, sodass Sie zuerst die Zeile und dann das Zeichen erkennen können.
Kostenlos, Open-Source.
Nikolaus Raul
Lasse V. Karlsen