2010-01-09 12 views
7

Todas las herramientas de diff que he encontrado están comparando línea por línea en lugar de char por char. ¿Hay alguna biblioteca que dé detalles sobre cadenas de una sola línea? Tal vez también una diferencia porcentual, aunque supongo que hay funciones separadas para eso.diff para líneas simples

+0

¿No es este un duplicado de http://stackoverflow.com/questions/1721738/using-diff-or-anything-else-to-get-character-level-diff -between-text-files? –

Respuesta

5

Este algoritmo diffs palabra por palabra:

http://github.com/paulgb/simplediff

disponibles en Python y PHP. Incluso puede escupir salida con formato HTML utilizando las etiquetas <ins> y <del>.

+0

Bueno, pero el espacio en blanco también debería ser importante. Una pestaña reemplazada por un espacio sería una diferencia no detectada por esto. –

+0

El código fuente parece bastante simple. Puedes cambiarlo fácilmente para dividirlo en una cadena vacía en lugar de en un espacio en blanco para que puedas diferenciar carácter por carácter. – slebetman

+0

En realidad, este funciona increíble, pasando las cadenas directamente a diff() en lugar de a través de stringDiff(). Funciona muy bien en una base de char por char, porque las cadenas son secuencias en python. Y la salida de la función es fácil de trabajar también. Sin embargo, me pregunto sobre los gastos generales de buscar la subcadena común más grande, cuando cada elemento tiene solo un carácter ... aunque es posible que esté malinterpretando el código ... –

3

Lo que podría intentar es dividir ambas cadenas carácter por carácter en líneas y luego puede usar diff en eso. Es un truco sucio, pero al menos debería funcionar y es bastante fácil de implementar.

Alternativamente, puede dividir la cadena en una lista de caracteres en Python y usar difflib. Comprobar Python difflib reference

+0

Pensé en esto y parece ser la "mejor" opción hasta ahora. También consideré buscar en las herramientas de línea de diferencia e intentar que tratara a los caracteres como líneas ... pero pensé que primero verificaría. –

+0

Eso se puede hacer fácilmente 'diff <(cat file1 | tr" "" \ n ") <(cat fil2 | tr" "" \ n ")' pero el problema es que la salida está mal formateada. Mucho mejor que hacer 'archivo wdiff1 archivo2' Gracias a @Michael Williamson respuesta. –

+0

Aquí hay una versión de carácter por carácter 'diff <(cat a1 | sed 's /./ \ 0 \ n /' g) <(cat a2 | sed 's /./ \ 0 \ n /' g) ' –

4

Estaba buscando algo similar recientemente, y encontré wdiff. Funciona con palabras, no con personajes, ¿pero está tan cerca de lo que estás buscando?

+0

Bueno, pero el espacio en blanco debería importar también. Una pestaña reemplazada por un espacio sería una diferencia no detectada por esto (si está dividida por espacios en blanco). –

+1

wdiff parece abandonado desde 1994. funciona, principalmente. – lhf

+0

@lhf, ¿está abandonado o simplemente no hay mucho para mejorar? –

Cuestiones relacionadas