Laden...

Datei einmal öffnen, mehrere Werte suchen, gefundene Ergebnisse in Textbox anzeigen

Erstellt von Padman vor 8 Jahren Letzter Beitrag vor 8 Jahren 950 Views
P
Padman Themenstarter:in
52 Beiträge seit 2015
vor 8 Jahren
Datei einmal öffnen, mehrere Werte suchen, gefundene Ergebnisse in Textbox anzeigen

Hallo,
leider bin ich Anfänger was dieses Thema betrifft, obwohl ich bisher dank des Internet dennoch kleine, einfache Anwendungen schreiben konnte. Leider fand ich zu diesem Problem keine Lösung.

Vorwort
Eine Datei soll geöffnet, mehrere Werte sollen gesucht und passend in Textboxen angezeigt werden. Ich konnte zwar im Netz ein Schnippsel finden was dieses im Prinzip macht und dieses zwar etwas umstricken, aber das Problem ist, dass die Datei vier mal geöffnet, gelesen und geschlossen werden muss, damit das Vorhaben überhaupt möglich ist.

Kurzfassung*Suchen: <BEISPIEL_1>Wert 1</BEISPIEL_1> <BEISPIEL_2>Wert 2</BEISPIEL_2> <BEISPIEL_3>Wert 3</BEISPIEL_3><BEISPIEL_4>Wert 4</BEISPIEL_4> *Ausgabe zu je einer Textbox *Datei-Öffnen-Dialog soll später eingebaut werden

Hier ein Auszug des umgebauten Schnippsel

/* <BEISPIEL_1> */
                StreamReader streamReader_BEISPIEL_1 = new StreamReader(FileName);
                string BEISPIEL_1 = streamReader_BEISPIEL_1.ReadToEnd();
                ICollection<string> matches_BEISPIEL_1 = Regex.Matches(BEISPIEL_1.Replace(Environment.NewLine, ""), @"\<BEISPIEL_1.*?\>(.*?)\</BEISPIEL_1\>")
                .Cast<Match>()
                .Select(x_BEISPIEL_1 => x_BEISPIEL_1.Groups[1].Value)
                .ToList();
                foreach (string match_PRODUCT_NAME in matches_BEISPIEL_1)
                    textBoxBEISPIEL_1.Text = (match_BEISPIEL_1);
                streamReader_BEISPIEL_1.Close();
                /* </BEISPIEL_1> */

/* <BEISPIEL_2> */
                StreamReader streamReader_BEISPIEL_2 = new StreamReader(FileName);
                string BEISPIEL_2 = streamReader_BEISPIEL_2.ReadToEnd();
                ICollection<string> matches_BEISPIEL_2 = Regex.Matches(BEISPIEL_2.Replace(Environment.NewLine, ""), @"\<BEISPIEL_2.*?\>(.*?)\</BEISPIEL_2\>")
                .Cast<Match>()
                .Select(x_BEISPIEL_2 => x_BEISPIEL_2.Groups[1].Value)
                .ToList();
                foreach (string match_PRODUCT_NAME in matches_BEISPIEL_2)
                    textBoxBEISPIEL_2.Text = (match_BEISPIEL_2);
                streamReader_BEISPIEL_2.Close();
                /* </BEISPIEL_2> */

/* [Abschnitte wiederholen sich insgesamt vier mal] */

Mein Gedanke: Datei nur noch einmal öffnen, und zum Beispiel 4 Werte aus einer Datei suchen und getrennt in Textboxen anzeigen und schließen. Die Datei soll später auch manuell zum lesen per Öffnen-Dialog geladen werden können. Ich hatte zwar schon einiges probiert, aber ich steige leider nicht durch. Die zu ladende Datei ist eine "Misch-Datei" welche irgendwann auch XML-Daten enthält.

Über Lösungsvorschläge bin ich euch sehr dankbar 🙂

Gruß Padman
C
2.122 Beiträge seit 2010
vor 8 Jahren

Du lädst vier mal die selbe Datei in jeweils eine neue Stringvariable und kommst selbst schon auf die Idee sie nur einmal zu laden.
Tip: Wie oft darf man Variablen verwenden?

Noch ein Tip: mit XmlDocument oder XmlReader kannst du direkt XML verarbeiten ohne das selbst zusammenzustückeln.

P
Padman Themenstarter:in
52 Beiträge seit 2015
vor 8 Jahren

Du lädst vier mal die selbe Datei in jeweils eine neue Stringvariable und kommst selbst schon auf die Idee sie nur einmal zu laden.

Ich werde mich noch einmal daran setzen 🙁

Tip: Wie oft darf man Variablen verwenden?

Mehrmals.

Noch ein Tip: mit XmlDocument oder XmlReader kannst du direkt XML verarbeiten ohne das selbst zusammenzustückeln.

Ich fand ein Beispiel, konforme XML-Dateien waren kein Problem, hierbei handelt es sich nicht direkt um eine XML-Datei, sondern um eine "Mischdatei" welche andere verschiedene Daten enthält und irgendwann kommt ein Abschnitt mit einem gültigen XML-Daten. Die Zieldatei enthält irgendwann den XML welches im Texteditor als Klartext anzeigbar ist.

Edit
Unwissender Weise klappt es nach einem kleinen Umbau 8) jetzt muss ich mir nur noch den Rest zusammen basteln 😉

Die Lösung war, augenscheinlich einfach 8o ob diese konform ist, keine Ahnung.


                StreamReader streamReader = new StreamReader(FileName);
                string READ_TO_END = streamReader.ReadToEnd();

/* <BEISPIEL_1> */
                ICollection<string> matches_BEISPIEL_1 = Regex.Matches(READ_TO_END.Replace(Environment.NewLine, ""), @"\<BEISPIEL_1.*?\>(.*?)\</BEISPIEL_1\>")
                .Cast<Match>()
                .Select(x_BEISPIEL_1 => x_BEISPIEL_1.Groups[1].Value)
                .ToList();
                foreach (string match_PRODUCT_NAME in matches_BEISPIEL_1)
                    textBoxBEISPIEL_1.Text = (match_BEISPIEL_1);
                streamReader_BEISPIEL_1.Close();
                /* </BEISPIEL_1> */

/* <BEISPIEL_2> */
                ICollection<string> matches_BEISPIEL_2 = Regex.Matches(READ_TO_END.Replace(Environment.NewLine, ""), @"\<BEISPIEL_2.*?\>(.*?)\</BEISPIEL_2\>")
                .Cast<Match>()
                .Select(x_BEISPIEL_2 => x_BEISPIEL_2.Groups[1].Value)
                .ToList();
                foreach (string match_PRODUCT_NAME in matches_BEISPIEL_2)
                    textBoxBEISPIEL_2.Text = (match_BEISPIEL_2);
                streamReader_BEISPIEL_2.Close();
                /* </BEISPIEL_2> */

Ob die ganze Sache kompakter gemacht werden könnte, weiß ich noch nicht.

Gruß Padman