Autor Beitrag
M-Cha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Di 29.09.09 12:12 
Ich habe eine Datei die aus mehreren Zeilen COde besteht! Aus dieser Datei sollen alle Strings zwischen Wort1 und .(leerzeile/Zeilenumbruch) ausgelesen werden.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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
www.mycsharp.de/wbb2...d.php?threadid=41009
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Di 29.09.09 12:36 
Zur Information: es handelt sich um die Fortsetzung dieser Diskussion. 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#. 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: 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. 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#. 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 - das muss wirklich nicht sein.
M-Cha Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Di 29.09.09 16:42 
Ich war etwas zu schnell! Ich habe es raus bekommen.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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 :
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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 :
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: 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 :
ausblenden 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!

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: Mi 30.09.09 09:53 
So wie ich verstanden habe, muss ich nur diesen Teil umändern

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


in

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Mi 30.09.09 11:39 
user profile iconM-Cha hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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.


Zuletzt bearbeitet von bakachan am Mi 30.09.09 13:42, insgesamt 1-mal bearbeitet
M-Cha Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67



BeitragVerfasst: 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!

ausblenden 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!