ich soll zwei Dateien vergleichen C#?


01.06.2021, 13:55

Wieso bis jetzt keine Rückmeldung, dass ich nicht normal??

2 Antworten

Du kannst Änderungen zwar in eine Datei schreiben, aber wie willst Du in einer Textdatei irgendwas bunt machen? Dafür brauchst Du schon ein entsprechendes Dokumentenformat. Textdateien sind unformatiert.

Außerdem ist ein zeilenweiser Vergleich nur dann sinnvoll, wenn Du davon ausgehst, dass in B keine neuen Zeilen eingefügt werden. Ansonsten werden sich ab dieser Zeile ALLE weiteren Zeilen unterscheiden.

Sollte das keine Aufgabe aus dem Schulunterricht sein, dann solltest Du Dich eventuell auf vorhandene Bibliotheken, die eben auch erkennen, ab wann die Dateien wieder übereinstimmen, verlassen und nicht das Rad neu erfinden.

MajdKing 
Fragesteller
 02.06.2021, 15:02

Die Ausgabe soll in ein XLM Datei sein. Aber ich weiß nicht wie ich so was programmieren kann.
in der Datei B wird keinen Zeilen eingefügt. kannst du mir helfen, dies Programm fertig zu schreiben?

0
ohwehohach  02.06.2021, 19:12
@MajdKing

Auch in XML wird nichts bunt. Das ist nur ein Metaformat.

Du musst beide Dateien in String Arrays einlesen (Files.ReadAllLines). Dann kannst Du in einer Schleife von 0 bis Max(array1.length, array2.length) über die Zeilen laufen und String für String vergleichen. Dabei aufpassen, weil die Array-Variable nun ja auch größer werden kann als sie darf. Also immer mit if (variable < array.length) prüfen, ob es noch geht.

Was Du mit den geänderten Zeilen machen willst, musst Du dann halt überlegen. Aber wie möchtest Du denn den Unterschied zwischen "geändert" und "hinzugefügt" erkennen?

0
MajdKing 
Fragesteller
 04.06.2021, 09:09
@ohwehohach

den Unterschied kann ich mit einer if Schreilfe nicht erkennen? ich meine Wenn in datei A die Zeile vorhanden ist und in Datei B nicht, dann soll es in der result datei mit dem Farbe blau kopiert werden. kann man so was nicht programmieren?

0
MajdKing 
Fragesteller
 04.06.2021, 09:14
@MajdKing

@ohwehohach

public void Dateivergleich(string A, string B)

    {

       {

string path = @"path";

        string[] linesA = File.ReadAllLines(A);

        string[] linesB = File.ReadAllLines(B);

        List<string> onlyBLines = new List<string>();

        int linecount = 0;

        foreach (string line in linesB)

        {

          if (line.StartsWith("%"))

          {

            onlyBLines.Add(line.Split()[0]);

          }

          else if (linesA.Contains(line))

          {

          }

          else if (linesA.Contains(line))

          {

          }

          else

          {

            onlyBLines.Add(line.Split()[0]);

          }

          linecount = linecount + 1;

          IEnumerable<string> onlyA = linesB.Except(linesA);

        }

        File.WriteAllLines(Path.Combine(path, "result.txt"), onlyBLines);

      }

aber da habe ich ein Problem. wenn eine Zeile in Datei A vorhanden ist und in B nicht dann wird die Zeile in Result datei nicht kopiert. weißt du warum? ich komme ned weiter. Danke für deine Hilfe

0
ohwehohach  04.06.2021, 09:26
@MajdKing

Programmieren kann man alles - die Frage ist nur, mit welchem Aufwand und wieviel Intelligenz im Algorithmus steckt. Stell Dir das folgendermaßen vor:

Du hast 10 Wörter. Jedes dieser Wörter schreibst Du nun auf je zwei Zettel. Je zwei dieser Zettel mit demselben Wort legst Du nun nebeneinander, alle 10 Wörter untereinander.

Vergleichst Du jetzt die linke und die rechte Seite: Voilá, keine Unterschiede. Wenn Du nun auf einem der rechten Zettel einen Buchstaben durch einen anderen ersetzt: Voilá, Du findest genau einen Unterschied, wenn Du wieder von oben nach unten alle Zettel betrachtest.

Was aber passiert, wenn Du nun auf der rechten Seite an irgendeiner Stelle ein beliebiges neues Wort, das bisher nicht da war, einfügst? Du findest in dieser Zeile einen Unterschied und auch in allen folgenden Zeilen.

Der Trick ist nun, zu erkennen, dass das nicht einfach nur Unterschiede sind, sondern dass eine Zeile eingefügt wurde. Dazu muss man erkennen können, dass wieder alles stimmen würde, wenn man auf der linken Seite an der entsprechenden Stelle eben einfach einen leeren Zettel einfügt. Dann sind auf beiden Seiten wieder gleich viele Zettel, nämlich 11, man hat zwei Unterschiede, nämlich dort, wo links der leere Zettel ist und rechts das neue Wort und dort, wo Du rechts einen Buchstaben geändert hast.

Wie gesagt: Über Farben reden wir hier gar nicht. XML kann keine Farben darstellen. Das ist später dann die Frage, wie Du Dein XML visualisierst.

Jetzt musst Du Dir halt überlegen, wie ein schlauer Algorithmus für obiges wäre. Und beachte dabei auch den Fall, dass alles gesagte auch auf der linken Seite stattfinden kann.

0
MajdKing 
Fragesteller
 04.06.2021, 09:36
@ohwehohach

kannst du mir helfen, das zu programmieren? bitte
ich sitze halt vor drei Tage vor den PC und komme ned weiter

0

Hi, ich bin mir nicht sicher wie genau du vergleichen möchtest, aber eine gute Variante wäre diese Bibliothek hier:

https://github.com/google/diff-match-patch

Die Unterschiede kannst du Positionsgenau bestimmen, wenn du davon ausgehst, dass A Original und B Von Original abstammend geändert wurde.

Woher ich das weiß:Berufserfahrung – Senior-Softwaredeveloper mit 20 Jahren Berufserfahrung.