einfach zu implementierende diff klasse für c++ mit .net gesucht
-
es geht um den inhalt von html-dateien. wenn ich "rein" zeichenweise vergleiche:
1. file: <html><head><aenderung><a ...
2. file: <html><head><a href><...
---------------------------^^
sieht man schon gleich, an welcher stelle es haken wird.
-
wiegesagt, rein zeichenweise würde bei meinem beispiel etwas derartiges ergeben:
1. file: <html><head><aenderung><a ...
2. file: <html><head><a href><...
ergebnis: enderung><a ... und alles was danach kommt
rauskommen sollte aber <aenderung>ich weiß, dass es solche tools gibt, benötige es im eigenen code.
-
ja, dann darfst du nicht zeichenweise vergleichen, sondern element weise...
ich habe im hinterkopf, dass es sowas für xml schon gibt.Ansonsten das XML Notepad kann das:
http://www.microsoft.com/downloads/details.aspx?familyid=72d6aa49-787d-4118-ba5f-4f30fe913628&displaylang=en
(Ist ein .NET Programm und du könntest es reverse Engineeren mit dem Reflector)
-
Ansonsten:
Einlesen, splitten in Elemente und dann die Elemente vergleichen.
-
bevor ich mich ins reverse engineering stürze
lass uns doch mal kurz bei meinem eigentlichen (und letzen in diesem programm) problem bleiben:ich habe 2 char-arrays oder von mir aus auch String^s, mit fast identischem inhalt. ich möchte den einen string von dem anderen "subtrahieren". wieso klappt das nicht, bzw, was wäre ein guter weg, DASS es klappt?
-
vielleicht sollte ich meine frage in obiger form umformuliert nochmal neu im ansi-c stellen... was sagen die mods dazu?
-
lass die frage doch hier.. die wird dann schon verschoben.
Was möchtest du denn dass hier herauskommt?
1. file: <html><hasdfad><a href><...
2. file: <html><head><a href><...soll dabei <hasdfad> rauskommen?
-
also ich habe ja bereits die lcs davon, die so aussehn würde:
<html><a href><...würde nun gerne file1 minus lcs und file2 minus lcs machen, ideales ergebnis:
file1: <hasdfad>
file2: <head>
-
wie gesagt, dann würde ich die dateien einlesen, in elemente splitten (speratoren sind < und >) und dann die elemente vergleichen.
1. file: <html><hasdfad><a href><...
2. file: <html><head><a href><...
lcs str: <html><hlcs str ist der substring von character 0 bis lcs.
habe ich das korrekt verstanden?
-
nein, (oder ich habe dich jetzt falsch verstanden) lcs = longest common subsequence, ist das, was in beiden dateien gleich ist. also:
string1 = "der hund rennt sehr gerne schnell"
string2 = "der hund beisst sehr oft"
lcs = "der hund sehr"string1-lcs = "rennt gerne schnell"
string2-lcs = "beisst oft"das subtrahieren müßte eigentlich mit der for-schleife, die ich anfangs geschrieben habe, funktionieren, da die lcs ja "geordnet" ist. da es nicht funktioniert, tippe ich eher auf eine art typecast-problem, o.ä.
-
oder ich zähle falsch
-
ja, ok, dann halt von hinten her:
1. file: <html><hasdfad><a href><...
2. file: <html><head><a href><...
1. lcs: asdfad><a href><...??
-
ne, der lcs wäre in dem fall wieder:
lcs: <html><a href><...lcs schmeisst genau das raus, was NICHT in beiden dateien drin ist, und behält den rest. und genau das muß ich "invertieren"
-
oder du meintest 1.string-lcs, das wäre in deinem beispiel <hasdfad> und das gewünschte ergebniss
-
sorry, ich verstehs nicht ganz.
ich denke ich würds umgekehrt machen und via elemente.
-
habs mal umgeschrieben:
while((n > q) && ( m > r)) { if(changedummy[q] == actfile[r]) { q++; r++; } else { changelog[s] = actfile[r]; s++; r++; } }
liefert jetzt fast akzeptable ergebnisse (mit kleinen ausnahmen).
werde das ganze jetzt noch so umbauen, dass bei einer gefundenen änderung die komplette zeile rausgebounced wird, dann sollte man damit arbeiten können.
-
ps: ein großes problem war wohl, dass ich den speicher hinter mir nich sauber aufgeräumt hab... shame on me
-
so jetzt läuft alles, aber ich habe durch LCS probleme mit dem speicher, da es eine quadratische matrix benutzt -> 4000 zeichen=16mb 16000zeichen=270mb !!
also falls noch jemand ne vernünftige diff-klasse hat, bitte mir schreibentnx