Entwickler-Ecke

Basistechnologien - Mehrere String aus Datei auslesen?


M-Cha - Di 29.09.09 12:12
Titel: Mehrere String aus Datei auslesen?
Ich habe eine Datei die aus mehreren Zeilen COde besteht! Aus dieser Datei sollen alle Strings zwischen Wort1 und .(leerzeile/Zeilenumbruch) ausgelesen werden.


C#-Quelltext
1:
2:
3:
4:
5:
pos_find  = inhaltA.IndexOf("Wort1");
pos_punkt = inhaltA.IndexOf("Wort2");
posg = pos_punkt - pos_find;

GefundenString = inhaltA.Substring(pos_find, posg + 8);


FRAGE 1:
Das habe ich bis jetzt schon hinbekommen. Er ließt mir den String zwischen Wort1 und Wort2. Aber wie sage ich ihm, das er den String ab Wort1 bis zum ersten "PUNKT mit LEERZEICHEN bzw. ZEILENUMBRUCH" lesen soll??

FRAGE 2:

Da das Wort1 mehrmals vorkommt möchte ich das er alle String ausließt und in variablen Speichert. Zur Zeit ließt er nur den ersten gefundenen String und beendet das Programm.

Danke schon mal im vorraus!

BEISPIEL TEXTDATEI:

Es handelt sich hierbei z.b um folgenden Text:

Infotext blallblbdlb
bllblllbbllb
lblbllbbl

Wort1 lblbllbllllbl lblblblbl Wort2 / bzw. PUNKT mit leerzeichenhinter

bllblllbbllb
lblbllbbl
bllblllbbllb
lblbllbbl

Wort1 lblbllbllllbl lblblblbl Wort2 / bzw. PUNKT mit leerzeichenhinter

bllblllbbllb
lblbllbbl
bllblllbbllb
lblbllbbl

Der Text von WORT1 und dem ersten Punkt+ Leerzeiche soll ausgelsen werden und in Variablen gespeichert werden.

Manchmal kommt das Wort1 mehrmals in einer Datei vor. Manchmal aber auch ein mal.

Es handelt sich hierbei um wichtige Dinge die aus der Textdatei gefiltert werden sollen!

Moderiert von user profile iconChristian S.: Color- durch C#-Tags ersetzt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mi 30.09.2009 um 11:54


bakachan - Di 29.09.09 12:26

In diesem Fall würde ich die RegEx (Regular Expressions) empfehlen.
Das entsprechende RegEx-Pattern solltest du dir recht leicht zusammenbauen können.
Dann einfach über die .Matches-Funktion alle Treffer holen und per Schleife durchlaufen udn verarbeiten.

Edit:
Hier noch ein link zu einem Tutorial für RegEx
http://www.mycsharp.de/wbb2/thread.php?threadid=41009


JüTho - Di 29.09.09 12:36

Zur Information: es handelt sich um die Fortsetzung dieser Diskussion [http://www.mycsharp.de/wbb2/thread.php?threadid=76689]. Danach passt RegEx nur bedingt.

@M-Cha
Zitat:
Aber wie sage ich ihm, das er den String ab Wort1 bis zum ersten "PUNKT mit LEERZEICHEN bzw. ZEILENUMBRUCH" lesen soll??

Es gibt nicht nur eine String.IndexOf-Methode, sondern viele Überladungen. Du musst dir eine passende heraussuchen.

Zu Frage 2: Schon einmal was davon gehört, dass es Schleifen gibt? Hier ist vermutlich do-while am besten.

Zur Einführung verweise ich auf OpenBook VC# [http://openbook.galileocomputing.de/visual_csharp]. Zum Suchen nach Möglichkeiten ist das eigenständige Blättern in der SDK-Doku/MSDN, vor allem dem Index, sehr zu empfehlen.

Jürgen


M-Cha - Di 29.09.09 12:59

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Zur Information: es handelt sich um die Fortsetzung dieser Diskussion [http://www.mycsharp.de/wbb2/thread.php?threadid=76689]. Danach passt RegEx nur bedingt.

@M-Cha
Zitat:
Aber wie sage ich ihm, das er den String ab Wort1 bis zum ersten "PUNKT mit LEERZEICHEN bzw. ZEILENUMBRUCH" lesen soll??

Es gibt nicht nur eine String.IndexOf-Methode, sondern viele Überladungen. Du musst dir eine passende heraussuchen.

Zu Frage 2: Schon einmal was davon gehört, dass es Schleifen gibt? Hier ist vermutlich do-while am besten.

Zur Einführung verweise ich auf OpenBook VC# [http://openbook.galileocomputing.de/visual_csharp]. Zum Suchen nach Möglichkeiten ist das eigenständige Blättern in der SDK-Doku/MSDN, vor allem dem Index, sehr zu empfehlen.

Jürgen


Er gibt mir ja den String aus wenn ich die Position von Wort1 und Wort2 habe. Aber wenn das Wort2 ein Punkt oder leerzeichen ist, nimmt er nicht den ersten Punkt mit Zeilenumbruch nachdem Find sondern vom start der Datei. Dann kommt auch eine Fehler das pos_punkt - pos_find nicht geht. Ist ja logisc weil pos_punk kleiner als pos_find ist.

Bräuchte da etwas Hilfe wie ich alle Strings zwischen Wort1 und dem ersten Punkt mit Leerzeichen/Zeilenumburch auslesen kann!!!


JüTho - Di 29.09.09 13:39

Ich habe dich auf die Überladungen hingewiesen. Dazu gibt es eine Variante von String.IndexOf mit folgender Erklärung laut SDK-Doku/MSDN:
Zitat:
Gibt den Index des ersten Vorkommens des angegebenen String in dieser Instanz an. Die Suche beginnt an einer angegebenen Zeichenposition.

Wenn du nicht weißt, wo und wie du suchen kannst: F1 auf IndexOf sollte weiterführen.

Jürgen

/Edit
Ach nee, noch eine weitere Diskussion [http://dotnet-forum.de/forums/t/1885.aspx] - das muss wirklich nicht sein.


M-Cha - Di 29.09.09 14:47

Ich werde daraus nicht schlau. Habe jetzt ein 16 Seitiges Tutorial durchgelesen. Da steht ja alles wunderbar beschreiben wie ich einen String Prüfen kann usw.

Ich muss aber die Strings erstmal finden ab Wort1 bis Wort2. Verzweifel langsam...

Ich habe so angefangen:

Regex FIND = new Regex("^[WORT1]$");
bool wahr = FIND.IsMatch(inhaltA);

InhaltA ist die ganze Datei mit Text! Soll der ja prüfen!


danielf - Di 29.09.09 15:56

Hallo,

und was sagt 'wahr'? - Naja, eigentlich auch egal... Was denkst du den, was dein Pattern macht? Das überprüft ob dein String (inhaltA) GENAU W, O, R, T oder 1 ist. Klingt nicht nach dem was du willst...

Mal was ganz anderes... Wenn deine ach so wichtigen Informationen in einer Zeile stehen, die mit dem Wort1 anfangen dann sollte folgendes funktionieren:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
            FileInfo sourceFile = new FileInfo("VeryImportantData.txt");

            string[] lines = sourceFile.OpenText().ReadToEnd().Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var line in lines)
            {
                if (line.StartsWith("Wort1"))
                {
                    // grab very very important information ...
                }
            }


Gruß Daniel

Ach: An deiner Variablebenennung solltest du vlt. bisschen arbeiten :o


bakachan - Di 29.09.09 16:12

user profile iconM-Cha hat folgendes geschrieben Zum zitierten Posting springen:
Da steht ja alles wunderbar beschreiben wie ich einen String Prüfen kann usw.

Ich muss aber die Strings erstmal finden ab Wort1 bis Wort2.

dann benutze nicht .IsMatch sondern .Matches da kriegst du eine Collection mit den Treffern zurück.
und dein RegEx-Pattern ist wie danielf schon gesagt hat nicht passend.


M-Cha - Di 29.09.09 16:42

Ich war etwas zu schnell! Ich habe es raus bekommen.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
            //Objekt erzeugen
            Regex FIND = new Regex("WORT1");
            Regex POINT = new Regex("WORT2");

            MatchCollection fd = FIND.Matches(inhaltA);
            MatchCollection pt = POINT.Matches(inhaltA);

            for (int i = 0; i < fd.Count; i++)
            {
                Console.WriteLine("Position FIND: " + fd[i].Index);
                Console.WriteLine("Gefunden wurde: " + fd[i].Value);
                for (int j = 0; j < pt.Count; j++)
                {
                }
                Console.WriteLine("Position POINT: " + pt[i].Index);
                Console.WriteLine("------------------------------");
            }


Bekomme jetzt jewals die Position raus. Aber statt dem Wort2 soll dort der erste .\n (Punkt+Leerzeicen) sein.

Er soll dann von Wort1 bis zum Punkt+Leerzeichen/Zeilenumbruch lesen.

Und dann immer diesen BEreich ausgeben!


bakachan - Di 29.09.09 16:49

Du hast den Sinn von Regex nicht verstanden.
Du sollst deinen gesuchten Ausdruck als Regex formulieren, mit indizes musst du dann nichts mehr machen.

z.B.
Regex Pattern :

C#-Quelltext
1:
Anfang.*?Ende                    

würde alles von "Anfang" bis "Ende" matchen.
also ich bezweifel das du wirklich ein tutorial dazu gelesen hast...


M-Cha - Di 29.09.09 17:01

Ich hab das aus einem Tutorial!

Ja ich weiß halt nur das WORT1 und bis wohin gelsen werden soll WORT2 (so nenne ichd as mal).

Was dazwischen ist weiß ich nicht. Wort1 bis Wort2 soll ausgelsen werden!


bakachan - Mi 30.09.09 08:34

user profile iconM-Cha hat folgendes geschrieben Zum zitierten Posting springen:
Was dazwischen ist weiß ich nicht.


Das musst du ja auch nicht wissen.
Für beliebige Zeichen gibt es den . (siehe mein Beispiel oben).
Und das stand garantiert auch in deinem Tutorial.


M-Cha - Mi 30.09.09 08:50

Ich bräuchte halt nur ein Beispiel zu meiner Sache, damit ich es besser verstehe!

Meinst du das Beisiel von "danielf" ? Wenn ja, er ließt ja nur die Zeile, wo das Wort1 anfängt. Er soll aber bis zum .\n (Punkt+Leerzeichen/Zeilenumbruch) lesen.


bakachan - Mi 30.09.09 09:04

user profile iconM-Cha hat folgendes geschrieben Zum zitierten Posting springen:
Ich bräuchte halt nur ein Beispiel zu meiner Sache, damit ich es besser verstehe!

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
z.B.
Regex Pattern :

C#-Quelltext
1:
Anfang.*?Ende                    

würde alles von "Anfang" bis "Ende" matchen.


Also ganz ehrlich noch wenn ich dir ein noch genaueres Beispiel gebe hast du ja garnichts mehr zu tun und ich bin nicht dafür da um dir deine Aufgabe zu lösen sondern nur um Hilfestellungen zu geben.


M-Cha - Mi 30.09.09 09:10

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconM-Cha hat folgendes geschrieben Zum zitierten Posting springen:
Ich bräuchte halt nur ein Beispiel zu meiner Sache, damit ich es besser verstehe!

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
z.B.
Regex Pattern :

C#-Quelltext
1:
Anfang.*?Ende                    

würde alles von "Anfang" bis "Ende" matchen.


Also ganz ehrlich noch wenn ich dir ein noch genaueres Beispiel gebe hast du ja garnichts mehr zu tun und ich bin nicht dafür da um dir deine Aufgabe zu lösen sondern nur um Hilfestellungen zu geben.


Ja das ist die Sache mit dem Matche sdie ich nicht ganz versteh!


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
            //Objekt erzeugen
            Regex FIND = new Regex("WORT1");
            Regex POINT = new Regex("WORT2");

            MatchCollection fd = FIND.Matches(inhaltA);
            MatchCollection pt = POINT.Matches(inhaltA);

            for (int i = 0; i < fd.Count; i++)
            {
                Console.WriteLine("Position FIND: " + fd[i].Index);
                Console.WriteLine("Gefunden wurde: " + fd[i].Value);
                for (int j = 0; j < pt.Count; j++)
                {
                }
                Console.WriteLine("Position POINT: " + pt[i].Index);
                Console.WriteLine("------------------------------");
            }


Ich Match hier doch das erste Wort womit der String anfangen soll! Nur den Rest versteh ich nicht.... der Rest zwischen Wort1 und dem .\n ist beliebig lang.

Da hackt es bei mir!


bakachan - Mi 30.09.09 09:26

Wieso matcht du Wort1 ? du willst doch nicht nur Wort1 haben sondern von Wort1 bis Wort2.
Ein Regex ist ein Schema nach dem gesucht wird.


nehmen wir mal den Mittelteil aus meinen Beipiel:
.*?

und jetz nehmen wir dazu mal die Erklärung aus dem Tutorial das ich am Anfang gepostet hatte:
Zitat:
steht der Punkt für ein beliebiges Zeichen

Zitat:
*: Der voranstehende Ausdruck darf beliebig oft (auch keinmal) vorkommen. (Dies entspricht {0,})

Zitat:
„genügsames“ Verhalten zu verwenden:
Eine Möglichkeit ist, hinter dem Quantor das Zeichen ? anzuhängen.


also beliebig viele beliebige Zeichen und das ganze mit genügsamen Verhalten


M-Cha - Mi 30.09.09 09:53

So wie ich verstanden habe, muss ich nur diesen Teil umändern


C#-Quelltext
1:
Regex FIND = new Regex("Wort1");                    


in


C#-Quelltext
1:
Regex FIND = new Regex("^[WORT1].*?[.]\n");                    


und das Objekt POINT kann gelöscht werden?

Ich muss nur das Objekt FIND richtig Pattern?


danielf - Mi 30.09.09 10:26

Ich glaub du hast in dem Thread genug Hilfestellungen bekommen um das Problem nun selbstständig zu lösen.

Für mich ist der Thread somit beendet, bye.


bakachan - Mi 30.09.09 11:39

user profile iconM-Cha hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
Regex FIND = new Regex("^[WORT1].*?[.]\n");                    

Stichworte:
- Gruppierungen
- Escapen/Maskieren
- RegEx Options

Es wurde dir oft genug erklärt und genug Hinweise gegeben, einige davon sogar mehrmals.
Mehr erklären bringt ncihts mehr wenn du nichtmal das was man schreibt richtig liest/verstehst.


M-Cha - Mi 30.09.09 11:46

Ja ich versuche jemanden zu helfen eine Programm zu machen für einen Verein! Habe gesagt ich versuche es. Deshalb brauche ich etwas Hilfe.

Hab jetzt den String lesen können.

Aber nicht den ganzen leider!


C#-Quelltext
1:
new Regex("(TABLE).*?.\r")                    


Er findet das Wort "Table" und liest auch ab da an. Leider nur bis zum Zeilenende! Er Soll aber weiter lesen, bis der PUNKT+Zeilenumbruch kommt!


danielf - Mi 30.09.09 12:18

Da bei Regular Expression der . als ein beliebiges Zeichen verwendet wird, muss du diesen Escapen.

D.h. willst du wirklich einen Punkt in deinem Pattern verwenden muss du ihn mit einem Backslash angeben \.


C#-Quelltext
1:
new Regex("(TABLE).*?\.\r")                    


Das Pattern matched nun von TABLE bis .Zeilenumbruch. Bezüglich des Zeilenumbruches musst du dir noch die RegEx Options (siehe bakachan) anschauen.

Gruß Daniel


M-Cha - Mi 30.09.09 13:30

Ja habe jetzt wegen den RegOptions mal etwas nachgelesen und bin der Meinung ich brauche die Multline funktion. Hab sie dann eingebaut!


C#-Quelltext
1:
Regex FIND = new Regex("(FIND).*?\.\r", RegexOptions.Multiline);                    


Aber mir wird gesagt das "\." = Fehler 1 Nicht erkannte Escapesequenz.

Mache ich ein zweites \ dran, geht es aber er lässt alle strings aus, die länger als eine Zeile sind!


bakachan - Mi 30.09.09 13:41

user profile iconM-Cha hat folgendes geschrieben Zum zitierten Posting springen:
Ja habe jetzt wegen den RegOptions mal etwas nachgelesen und bin der Meinung ich brauche die Multline funktion.


Zitat:
RegexOptions.Multiline - Multiline mode. Changes the meaning of ^ and $ so they match at the beginning and end, respectively, of any line, and not just the beginning and end of the entire string.

RegexOptions.Singleline - Specifies single-line mode. Changes the meaning of the dot (.) so it matches every character (instead of every character except \n).


und jetz denk mal drüber nach was wohl besser geeignet ist


M-Cha - Mi 30.09.09 14:06

Oh man. Manchmal sollte ich gründlicher lesen. Singleline natürlich!

MULTILINE:
Mehrzeilenmodus. Ändert die Bedeutung von ^ und $, sodass sie jeweils dem Anfang und Ende einer beliebigen Zeile und nicht nur dem Anfang und Ende der gesamten Zeichenfolge entsprechen.

SINGLELINE: Gibt den Einzeilenmodus an. Ändert die Bedeutung des Punktes (.), sodass dieser jedem Zeichen entspricht (und nicht mit Ausnahme von \n).

Leider stimmt da was mit dem Punkt nicht so wie mir geraten wurde!

\. = Nicht erkannte Escapesequenz

So sieht es aus:


C#-Quelltext
1:
Regex FIND = new Regex("(FIND).*?\.\r", RegexOptions.Singleline);                    


Christian S. - Mi 30.09.09 14:08

user profile iconM-Cha hat folgendes geschrieben Zum zitierten Posting springen:
\. = Nicht erkannte Escapesequenz
Was Backslashes in C#-Strings bewirken, gehört eigentlich zu den absoluten Grundlagen. Entweder escapesst Du mit noch einem Backslash oder Du schreibst ein "@" vor den String, dann werden die Backslashes nicht als Escape-Zeichen angesehen.


JasonDelife - Mi 30.09.09 15:00

Damit nicht alles doppelt kommt.
Hier wurde das von M-Cha auch gefragt: http://forum.fachinformatiker.de/net/131964-regex-pattern.html

Grüße, JasonDelife.


M-Cha - Mi 30.09.09 15:24

Super hat geklappt! War das eine schwere Geburt!

Danke allen für die Hilfe! Muss jetzt noch paar andere Dinge auslesen usw....


M-Cha - Do 01.10.09 14:46

Da ich kein neus Thema öffnen möchte , frage ich hiermal nach.

Ich habe ja jetzt meine String.

"Wort1 T1 T2 T3 T4 sdfkjk ckjkjgk ksdfjksdjfkl sklfjskjf Wort2";

Aus meinen String möchte ich noch etwas auslesen! Das Problem das Wort steht an ungleichenstellen!

Davor steht meistens das Wort "Verein, Platz, Spiel" und dann folgt das gesuchte Wort.

Manchmal steht da nur VErein oder Verein, Spiel und dann das gesuchte Wort!

Kann man mit Regex das regeln, das er die Wörter Verein, Platz, Spiel ignorieren soll und dann das darauffolgende Wort ausgeben soll?


danielf - Do 01.10.09 15:04

Na klar kann man das machen ;)

Versuch so ein Pattern:

"Wort1.*?((Verein)|(Platz)|(Spiel)|(\s)|(,))*?Wort2"

Du sagst im Prinzip beliebig oft der inhalt der äußeren Klammer ()* und in der Inhalt soll entweder Verein Platz oder Spiel sein. Ausserdem dürfen darin noch Leerstellen und Kommas vorkommen.

Nur mal so ein Tipp: Mit Regulären Ausdrücken solltest du immer versuchen alles genau zu definieren und möglichst wenig mit beliebigen Zeichen arbeiten. mit (?<name>AUSDRUCK) kannst du zum Beispiel named groups erstellen. Die haben den Vorteil, dass man später einfach drauf zu greifen kann, sich die Reihenfolge ändern kann und vorallem es viel lesbarer ist.

Gruß Daniel


M-Cha - Do 01.10.09 15:29

Also ich habe jetzt folgenden RegEX


C#-Quelltext
1:
"(?i)TABLE.*?((Verein)|(PLATZ)|(SPIEL)|(\\s)|(,))*?\\s"                    


Das (?i) steht ja für Groß als auch kleinschreibung sind erlaubt. Danach soll er das Wort TABLE suchen! Nach dem TABLE können folgende Wörter noch auftauchen VEREIN, PLATZ, SPIEL. Also alle (TABLE VEREIN PLATZ SPIEL, oder nur 3 (FIND VEREIN PLATZ), oder nur 1 (FIND).

Wenn diese Wörter direkt nachdem FIND nicht vorkommen, soll er mir das darauffolgende Wort auslesen bis zum nächsten Leerzeichen!

Leider ließt er mir den ganzen String vom FIND aus!


danielf - Do 01.10.09 15:51

Gib mal dein Input-String...


M-Cha - Fr 02.10.09 13:44

TABLE VEREIN SPIEL PLATZ Dormtund text text blal blal blallblalb;

Er soll jeweils das nächste Wort auslesen das nicht (Spiel, Platz, Verein oder TABLE ist)
In dem Fall wäre es dortmund!


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Regex TABLE = new Regex("(?i)TABLE.*?((VEREIN)|(PLATZ)|(SPIEL)|(\\s)|(,))*?\\s", RegexOptions.Singleline);

                MatchCollection ne = TABLE.Matches(fd[i].Value);

                for (int j = 0; j < ne.Count; j++)
                {
                    Console.WriteLine("Position: " + ne[j].Index);
                    Console.WriteLine("STRING Wort: " + ne[j].Value);
                }


danielf - Fr 02.10.09 14:03

man.. dir zu helfen ist echt sau schwierig, bei denen Angaben!


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
            string input = "TABLE VEREIN SPIEL PLATZ Dormtund text text blal blal blallblalb;";
            string pattern = @"((TABLE)|(VEREIN)|(SPIEL)|(PLATZ)|(\s))* (?<Verein>.*?) .*";

            Match match = Regex.Match(input, pattern);

            if (match.Success)
            {
                Console.WriteLine(string.Format("Verein: {0}", match.Groups["Verein"]));
            }


Ich wollte den konkreten input string und nicht wieder ein unvollständiges Beispiel von dir. Beim anpassen auf deinen String wirst du wieder über eine Kleinigkeit stolpern weil du es nicht verstanden hast was wir dir versuchen zu erklären.

Wir versuchen die Antworten auch Verständlich und Vollständig zu formulieren, damit du was damit anfangen kannst.

Gruß Daniel


M-Cha - Di 20.10.09 12:08

Anwort hat alles Super geklappt! Hab jetzt noch ein kleines Probelem was mir aufgefallen ist.

Das Wort was ich suche seht manchmal auch in einem Kommentar drin!

Das merkmale wäre dann, das er alle String ausgeben soll, die nicht in dem Kommenatr zwischen "/*" und "*/" stehen.

So sieht der Patter zur zeit aus: Regex test = new Regex("(?i)(HAUS).*?\\.\r", RegexOptions.Singleline);

Ich möchte den so umändern, das er mir den String mit dem WOrt "Haus ausgibt, aber nicht den der zwischen den Kommentarzeichen steh bzw. bei denen ein // oder /* vor steht. Zusäzlich kann es sein, das der String mit einem "over." enden soll und nur mit einem punkt.

Beispiel Auszug Datei:

Haus 23 Rasenplatz Test over.
gfdgdfg
dgfd
gdfgdf
Haus 49 Rasenplatz Test.
/* Haus ende */


Der soll nur die Strings ausgeben, die nicht zwischen den Kommentarzeichen stehen!


M-Cha - Mi 11.11.09 12:00

user profile iconM-Cha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconM-Cha hat folgendes geschrieben Zum zitierten Posting springen:
Anwort hat alles Super geklappt! Hab jetzt noch ein kleines Probelem was mir aufgefallen ist.

Das Wort was ich suche steht manchmal auch in einem Kommentar drin!

Das merkmale wäre dann, das er alle String ausgeben soll, die nicht in dem Kommenatr zwischen "/*" und "*/" stehen.

So sieht der Patter zur zeit aus: Regex test = new Regex("(?i)(HAUS).*?\\.\r", RegexOptions.Singleline);

Ich möchte den so umändern, das er mir den String mit dem WOrt "Haus ausgibt, aber nicht den der zwischen den Kommentarzeichen steh bzw. bei denen ein // oder /* vor steht. Zusäzlich kann es sein, das der String mit einem "over." enden soll und nur mit einem punkt.

Beispiel Auszug Datei:

Haus 23 Rasenplatz Test over.
gfdgdfg
dgfd
gdfgdf
Haus 49 Rasenplatz Test.
/* Haus ende */

Der soll nur die Strings ausgeben, die nicht zwischen den Kommentarzeichen stehen!


Weiß den keiner einen Rat? Wäre echt super lieb! Das mit den Pattern ist Sau schwer zu verstehen!


M-Cha - Mo 16.11.09 10:37

So hab alles jetzt rausbekommen nur noch eine Kleinigkeit!


C#-Quelltext
1:
Regex test = new Regex("(?i)(HAUS).*?\\.\r", RegexOptions.Singleline);                    


Habe diesen Patter!

Er geht durch eine Textdatei und soll alle strings auslesen die mit "Haus" anfangen und mit einem Punkt+Zeilenumbruch enden!

Jetzt möchte ich das er alle Strings von "Haus" bis zum Wort "KAUF" bzw. "MIETE" liest!

Irgend ein Wort von den Beiden steht immer drin!

Wenn ich es so mache funktioniert es nicht richtig!


C#-Quelltext
1:
Regex test = new Regex("(?i)(HAUS).*?(KAUF)|(MIETE)", RegexOptions.Singleline);                    


Er liest dann von Haus bis KAUF aber nicht beim nächsten wenn miete mal drin steht statt kauf!


danielf - Mo 16.11.09 11:07

Hallo,

parst du nun eine Tabelle mit :
TABLE VEREIN SPIEL PLATZ Dormtund text text blal blal blallblalb;

oder einen Wohnungsmarkt mit:
"Haus" bis zum Wort "KAUF" bzw. "MIETE" liest!

??

Du solltest deine Fragen so konkret wie Möglich stellen um eine Antwort zu bekommen die dir weiter hilft.

Und zwei verschiedene Topics zu mischen verwirrt noch mehr.

Darüber hinaus ist dein Titel auch total ungeeignet.

Bitte mal überarbeiten, sonst wirst du auch weiterhin nur mit dir selber posten.

mfg Daniel


M-Cha - Mo 16.11.09 11:33

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

parst du nun eine Tabelle mit :
TABLE VEREIN SPIEL PLATZ Dormtund text text blal blal blallblalb;

oder einen Wohnungsmarkt mit:
"Haus" bis zum Wort "KAUF" bzw. "MIETE" liest!

??

Du solltest deine Fragen so konkret wie Möglich stellen um eine Antwort zu bekommen die dir weiter hilft.

Und zwei verschiedene Topics zu mischen verwirrt noch mehr.

Darüber hinaus ist dein Titel auch total ungeeignet.

Bitte mal überarbeiten, sonst wirst du auch weiterhin nur mit dir selber posten.

mfg Daniel



Ja an einer Stelle habe ich ja Vereine geparst! Vorher aber habt ihr mir erklärt wie ich ganze Strings parse! JEtzt ist mir aufgefallen es gibt eindeutigere Merkmale wo so ein String enden kann! Das Wäre am KAUF oder MIETE!

Soll bei HAUS anfangen und dann bei HAUS oder MIETE aufhören!

Jetzt möchte ich aus einer Datei die aus mehreren Zeilen besteht folgendes parsen!

- Jeweils den String vom Wort "Haus" bis zum nächsten Wort "Kauf" oder "Miete"!!!
Eins von den beiden ist immer dabei!

Mein alter Parser war ja so:

C#-Quelltext
1:
Regex FIND = new Regex("(?i)(HAUS).*?\\.\r", RegexOptions.Singleline);                    


Der neue Parser soll dann die Strings bis zu den Wörtern filtern! Nicht wie der alte zum Punkt+Zeilenumbruch!

Dise Strings gebe ich ja dann aus! Brauche nur den passenden Parser!

So sieht ungefähr die Datei aus! Ist eine Testdatei:

Quelltext
1:
2:
3:
4:
5:
Haus Berndstr. 41 12345 Berlin tssdfdfd tsfsdfsdft sffsdsts sfdttst Kauf
// Kommentar//
Text Text Text Text Text Text Text

Haus Berndstr. 41 12345 Berlin tssdfdfd tsfsdfsdft sffsdsts sfdttst MiETE


danielf - Mo 16.11.09 12:31

string pattern = @"Haus.+(Kauf|MiETE)";

Edit:
string pattern = @"Haus.+?(Kauf|MiETE)";
(none greedy)


M-Cha - Mo 16.11.09 12:49

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
string pattern = @"Haus.+(Kauf|MiETE)";


Danke aber leider macht er das nicht. Er gibt das ganze Aus! Das heißt von:

Haus Berndstr. 41 12345 Berlin tssdfdfd tsfsdfsdft
sffsdsts sfdttst Kauf

// Kommentar//
Text Text Text Text Text Text Text

Haus Berndstr. 41 12345 Berlin tssdfdfd tsfsdfsdft
sffsdsts
sfdttst MiETE


C#-Quelltext
1:
 Regex FIND = new Regex(@"(i?)(HAUS).+(KAUF|Miete)", RegexOptions.Singleline);                    


Der String sollte ja dann bei Kauf auch geschnitten werden!

________________________________________________________________________________________________________________________

Habe es rausbekommen! Richtig ist der hier:


C#-Quelltext
1:
Regex FIND = new Regex("(?i)(HAUS).*?(Kauf|Miete)", RegexOptions.Singleline);                    


Funktioniert wunderbar! Danke trotzdem!


M-Cha - Di 17.11.09 14:29

Gibt es vielleicht noch eine Möglichkeit ihm zusagen das er von Haus bis zum nächsten Haus oder Wohnung lesen soll?

Hab nänlich gesehen das jeder String der mit Haus anfängt, nicht immer eine Kauf oder Miete am ende stehen hat. Das heißt, er liest mir den String ab Haus.... findet kein Kauf oder Miete liest weiter, überliest das nächste Haus bis er endlich eine Kauf oder Miete hat!


C#-Quelltext
1:
Regex FIND = new Regex("(?i)(HAUS).*?(Kauf|Miete)", RegexOptions.Singleline);                    



BEISPIEL:


Haus Berndstr. 41 12345 Berlin tssdfdfd tsfsdfsdft sffsdsts sfdttst Kauf
// Kommentar//

Haus Brandstr. 41 12345 Berlin tssdfdfd tsfsdfsdft sffsdsts sfdttst

Text Text Text Text Text Text Text

Haus Berndstr. 41 12345 Berlin tssdfdfd tsfsdfsdft sffsdsts sfdttst MiETE

Hab das grün gekennzeichnet was ich meine! Der hat dann zwei Hausstrings in einem stehen weil das WOrt Kauf/Miete fehlt um zu schneiden.

Jetzt möchte ich einfach immer von HAus bis zum nächsten Haus oder Wohnung schneiden! So dass der nächste String mit Haus anfängt!


danielf - Di 17.11.09 14:57

Was steht den an der stelle tssdfdfd ???

Hat das Dokument überhaupt eine Struktur? Sprich ist es maschinell überhaupt verarbeitbar? Wenn nämlich Haus im Freitag vorkommt und tssdfd etc. Freitext ist, vermute ich, dass du mit diesem "Input" wenig anfangen kannst.


M-Cha - Di 17.11.09 15:09

Also ich versuche es mal so gut wie möglich zu erklären.

Jeder String, fängt mit dem Wort "Haus" neu an. Dann sollte ja immer bis Kauf ode rmiete gelesen werden.

Da ich gesehen habe, das es manchmal diese Wörter nicht gibt, möchte ich das er jeweils von Haus zu Haus liest bzw. von Haus oder Wohnung zum nächsten Haus oder Wohnung.

Dann kann ich nämlich die Strings die er ausgelesen hat weiterverarbeiten und prüfen ob die Wöter Kauf, Miete oder nichts vorkommen.

Also soll bei Haus oder Wohnung anfangen und solange den String auslesen bis das nächste Haus oder Wohnung kommt! Hängt ab was zu erst kommt.

Wäre würde jede Hilfe dankbar.


JüTho - Di 17.11.09 15:19

Kleine Randbemerkung: Es genügt, Sätze mit Punkt abzuschließen. Jeden Satz mit einem Ausrufezeichen zu beenden, zeugt von Ungeduld deinerseits. Ungeduldig werden aber die potenziellen Helfer, wenn du immer wieder ungenügende Informationen gibst. Schreib doch einmal vollständige und korrekte Beispieltexte... Jürgen

PS. Zur Sache kann ich mich mangels RegEx-Kenntnissen nicht äußern, aber die ständigen Rufe stören mich beim Lesen.


M-Cha - Di 17.11.09 15:58

Sorry, gar nciht darauf geachtet mit dem "Ausrufezeichen" :-)

Hier eine kleine Beispiel-Datei:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Wohnung: Berndstr. 41, 12345 Berlin, Abgelengende Wohnung 2 1/2 Zimmer Wohnung mit großer Küche und zwei Bädern. Kauf

// Kommentar// irgend ein text.... blab lbalb blalllabl lalaalala

Haus: Hansastr. 41 12345 Berlin, Doppelhaushälfte mit Garage

Text Text Text Text Text Text Text

Haus: Auguststr. 41 12345 Berlin tssdfdfd tsfsdfsdft sffsdsts sfdttst MiETE