| Autor |
Beitrag |
M-Cha
      
Beiträge: 67
|
Verfasst: 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.
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 Christian S.: Color- durch C#-Tags ersetztModeriert von Christian S.: Topic aus C# - Die Sprache verschoben am Mi 30.09.2009 um 11:54
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: 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
      
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 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 
      
Beiträge: 67
|
Verfasst: Di 29.09.09 12:59
JüTho hat folgendes geschrieben : | 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
      
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 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 
      
Beiträge: 67
|
Verfasst: 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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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")) { } } |
Gruß Daniel
Ach: An deiner Variablebenennung solltest du vlt. bisschen arbeiten 
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Di 29.09.09 16:12
M-Cha hat folgendes geschrieben : | 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 
      
Beiträge: 67
|
Verfasst: 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:
| 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
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: 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
würde alles von "Anfang" bis "Ende" matchen.
also ich bezweifel das du wirklich ein tutorial dazu gelesen hast...
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: 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
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Mi 30.09.09 08:34
M-Cha hat folgendes geschrieben : | | 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 
      
Beiträge: 67
|
Verfasst: 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
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Mi 30.09.09 09:04
|
|
M-Cha 
      
Beiträge: 67
|
Verfasst: Mi 30.09.09 09:10
|
|
bakachan
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: 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 
      
Beiträge: 67
|
Verfasst: 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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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
      
Beiträge: 503
Erhaltene Danke: 34
W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
|
Verfasst: Mi 30.09.09 11:39
M-Cha hat folgendes geschrieben : | 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 
      
Beiträge: 67
|
Verfasst: 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!
|
|