Autor |
Beitrag |
hauke1981
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 19.09.08 15:03
Dann ein neues Thema,
ich soll mit C# ein kleines Programm schreiben, mit dem man den Inhalt von zwei oder mehreren TXT Dateien vergleichen kann. Dabei soll dann in einer Textbox die Zeilen angezeigt werden wo keine Übereinstimmung vorhanden ist. Es soll also schnell erkenntlich sein welche Zeile in der einen Datei fehlt oder zuviel ist. Wie kann ich da am besten vorgehen? Mir wurde was von Hashtables gesagt, jedoch bin ich da ein wenig ratlos. Kann mir da einer einen Denkanstoß oder einen Lösungsvorschlag geben? Die Dateien sollen zuvor von einem OpenFileDialog ausgewählt werden.
Grüße
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 19.09.08 15:48
Nein, dafür reicht der Hash nicht mehr aus, sondern du mußt die Zeilen einzeln vergleichen. Schau dir mal dafür die sogenannten Edit-Distanzen (Levenshtein) an: de.wikipedia.org/wiki/Edit-Distanz. Anstatt auf Zeichenbasis mußt du dann auf Zeilenbasis vergleichen und du benötigst dafür ein Array der Größe (Zeilenanzahl_Datei1 + 1) * (Zeilenanzahl_Datei2 + 1). Viel Spaß damit (da das keine ganz so einfache Sache für einen Anfänger ist - oder welche Ausbildung hast du?)
|
|
hauke1981
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 22.09.08 08:15
Morgen,
hab Fachinformatiker gelernt und jetzt mein Studium zum Wirtschaftsinformatiker abgeschlossen, hatten dort aber nur im Grundstudium Java und leider kein C# deswegen bin ich gerade neu in der Materie.
Ich werd mir auf jeden Fall mal das mit den Edit Distanzen anschauen. Wenn man für jede Datei eine Hashtable nimmt und diese dann vergleicht, geht das auch oder ist die Lösung mit den Distanzen die elegantere?
Grüße
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 22.09.08 10:18
|
|
hauke1981
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 22.09.08 10:46
Hi,
danke für die Links aber ich weiss noch nicht ob ich damit klar komme
Versuche gerade die Inhalte aus der Textdatei in eine Hashtable einzulesen. Jedoch stoße ich immer auf das Problem, dass ich in dem FileStream nicht den Pfad der Datei so angeben kann wie ich gerne möchte.
Folgender Fehler kommt:
1-Argument: kann nicht von "string[]" in "string" konvertiert werden.
Hier mal nen Codeauszug
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| if (ofd1.ShowDialog() != DialogResult.OK) return; { FileStream fs = new FileStream(ofd1.FileNames, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(fs, Encoding.Default); char[] sep = new char[] {' '}; while (!sr.EndOfStream) { string[] str = sr.ReadLine().Split(sep, 2); try { if (str.Length <= 1) continue;
if (str[0].StartsWith(@"//")) continue;
if (ht.ContainsKey(str[0])) { System.Diagnostics.Debug.Assert(false, "key exists yet"); continue;
} ht.Add(str[0], str[1]); } catch (Exception) { } } |
Wie schaffe ich es, dass ich im FileStream den Pfad von einem OpenFileDialog angeben kann?
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 22.09.08 11:34
Warum muss denn die alte Diskussion OpenFileDialog, mehrere Dateien auslesen und anzeigen lassen wieder aufgewärmt werden? Dort wurde doch der Unterschied beim OpenFileDialog zwischen "string FileName" und "string[] FileNames" deutlich gemacht; ebenso hast Du mehrere Vorschläge dazu erhalten. Ich sehe aber nichts mehr davon, dass Du mehrere Dateien in einer Schleife bearbeiten willst.
Dringende Bitte: Mach Dir erst einmal klar, was Du brauchst, nämlich für jede Datei eine eigene Liste zum Vergleich (Hashtable oder Dictionary oder List<string> - je nachdem, wie Du den Vergleich durchführen willst), und überlege dann, wie jede dieser Listen ihre Inhalte bekommen soll.
Jürgen
|
|
hauke1981
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 22.09.08 13:23
Also ich möchte ein Programm mit dem ich dann über einen OpenFileDialog zwei oder mehrere Dateien auswählen kann um diese inhaltlich zu vergleichen. Wie ich die Dateien über den Dialog auswählen kann hab ich schon hinbekommen, jedoch weiss ich jetzt nicht weiter. Soweit ich mitbekommen sollen für jede Datei eine Hashtabelle angelegt werden.
Ich denke die Listen (Hashtables?) sollen ihre Inhalte über einen FileStream und einen StreamReader aus den textdateien bekommen oder verstehe ich das falsch?
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 22.09.08 14:09
Hallo,
ich weiß nicht, ob HashTables das richtige Verfahren sind. (Normalerweise ist Dictionary<TKey, TValue> vorzuziehen; aber da ich nicht darüber nachdenken will, wie der Vergleich ablaufen soll, lass ich das so stehen.)
Anstelle von Arrays ist List<T> immer praktischer.
hauke1981 hat folgendes geschrieben: | ... Wenn man für jede Datei eine Hashtable nimmt und diese dann vergleicht, |
Dann mach das doch auch: für jede Datei eine eigene HashTable!
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| List<HashTable> hashes = new List<HashTable>(ofd1.FileNames.Length);
foreach(string filename in ofd1.FileNames) { string[] content = File.ReadAllLines(filename);
HashTable ht = new HashTable(); foreach(string line in content) { ht.Add(str[0], str[1]); } hashes.Add(ht); } |
Im Prinzip gehört das alles in den if-Zweig nach dem OpenFileDialog; nur die hashes-Liste ist vermutlich woanders zu deklarieren und neu zu initialisieren.
Jürgen
|
|
hauke1981
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 22.09.08 14:25
Hi JüTho,
danke für die Hilfe. Ich wollte das eigentlich auch so machen habs aber leider nicht hinbekommen, hab schon einiges ausprobiert. wenigstens bin ich schon so weit gekommen, das ich einmal den Inhalt aus einer Hashtable in einer Textbox anzeigen lassen kann um zu schauen ob der Inhalt auch der richtige ist. War für mich schon ein ganzes Stück arbeit, aber wie heisst es so schön. Es ist noch kein Meister vom Himmel gefallen.
Also werde einmal deinen Vorschlag ausprobieren.
Danke
|
|
hauke1981
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 23.09.08 08:07
Hab es hinbekommen, war eigentlich dann doch recht einfach. Hab mal wieder zu kompliziert gedacht. Und Levenshtein hab ich gar nicht anwenden müßen  bin ich auch froh, hab das ganze jetzt über mehrere if Schleifen gelöst.
Grüße
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Di 23.09.08 09:50
|
|
hauke1981
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 23.09.08 10:43
Sorry dann if Abfragen
Bin jetzt noch ein bisschen am verfeinern aber danke an die Tipps.
|
|
foxy
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: Di 23.09.08 12:12
sry aber ich weis nicht was du in deinem studium gemacht hast :>
ich glaub das ist die erste aufgabe im ersten semester  dateien miteinander vergleichen 
_________________ "Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
|
|
hauke1981
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 23.09.08 16:09
Danke für das Kompliment, aber ich habe kein reines Informatik studiert, sondern ich habe Wirtschaftsinformatik studiert mit Schwerpunkt auf Geschäftsprozesse. Da war nach dem Grundstudium nichts mehr mit Programmieren. Die Sprache war Java und nicht C#.
Aber ich denke nicht das ich mich hier rechtfertigen muss.
Da die Frage beantwortet ist schliesse ich hiermit den Thread.
|
|