2009-12-19 15 views
17

Me gustaría mostrar las diferencias entre dos bloques de texto. En lugar de comparar líneas de texto o caracteres individuales, me gustaría simplemente comparar palabras separadas por caracteres específicos ('\ n', '', '\ t', por ejemplo). Mi razonamiento principal para esto es que el bloque de texto que voy a comparar generalmente no tiene muchos saltos de línea y las comparaciones de letras pueden ser difíciles de seguir.¿Cómo mostrar diferencias de palabras usando C#?

He encontrado el siguiente O(ND) logic in C# para comparar líneas y caracteres, pero no sé cómo modificarlo para comparar palabras.

Además, me gustaría hacer un seguimiento de los separadores entre palabras y asegurarme de que estén incluidas con la diferencia. Entonces, si un espacio se reemplaza por un retorno difícil, me gustaría que apareciera como un diferencial.

Estoy usando Asp.Net (C#) para mostrar todo el bloque de texto, incluyendo el texto original eliminado y el texto nuevo agregado (ambos se resaltarán para mostrar que fueron eliminados/agregados). Una solución que funciona con esas tecnologías sería apreciada.

Se agradece cualquier consejo sobre cómo lograr esto.

+0

divertirse. Un compañero de trabajo tiene que hacer esto para un lanzamiento de nuestra línea de productos insignia. Él fue suficientemente desafiado por eso.Y usó varios documentos de teoría para guiar su trabajo ... criticando todo el tiempo sobre la calidad de la escritura. –

Respuesta

15

Microsoft ha lanzado un proyecto diff en CodePlex que le permite hacer diferencias de palabras, caracteres y líneas. Está licenciado bajo la Licencia Pública de Microsoft (Ms-PL).

https://github.com/mmanela/diffplex

+2

DiffPlex le permite definir una función personalizada para la partición del texto antes de que se difunda. Usted puede utilizar el método: DiffResult CreateCustomDiffs (cadena oldtext, cadena newText, bool ignoreWhitespace, Func chunker) donde chunker dice DiffPlex cuáles son las unidades atómicas para comparar uno contra el otro. –

+0

Hola Jim, estoy buscando una solución similar, quería saber tu opinión si usas diffplex, ya que se solucionó tu problema. –

+0

Parece que utilicé http://www.codeproject.com/Articles/11454/A-word-wise-HTML-text-compare-and-merge-engine para mi solución. No recuerdo por qué lo usé en diffplex, tbh. Esta solución ajusta las palabras eliminadas y agregadas en las etiquetas html definidas, lo que le permite crear el estilo que desee. –

1

Aparte de algunas optimizaciones generales, si necesita incluir los separadores en la comparación, esencialmente está haciendo una comparación carácter por carácter con los descansos. Aunque podría usar el O (ND) que ha vinculado, hará tantos cambios como lo haría básicamente escribiendo el suyo.

El problema principal con la comparación de diferencias es encontrar la continuación (si elimino una sola palabra, pero dejo el resto igual).

Si desea utilizar su código, comience con el ejemplo y no escriba los caracteres eliminados, si hay caracteres reemplazados en el mismo lugar, no genere este resultado. Luego necesita calcular la ejecución continua más larga de palabras "cambiadas", resaltar esta cadena y salida.

Lo siento, eso no es una gran respuesta, pero para este problema la respuesta es básicamente escribir y ajustar la función.

0

Bien String.Split con '\ n', '' y '\ t' como los caracteres divididos le devolverán una matriz de palabras en su bloque de texto.

A continuación, puede comparar cada conjunto de diferencias. Una simple comparación 1: 1 le diría si alguna palabra ha sido cambiada. Comparando:

hello world how are you 

y:

hello there how are you 

le daría que world y cambiaron a there.

Lo que no diría es si las palabras se han insertado o eliminado y todavía tendría que analizar los bloques de texto carácter por carácter para ver si alguno de los caracteres separadores se ha cambiado.

+1

Me temo que String.Split para grandes bloques de texto será ineficaz. –

Cuestiones relacionadas