C# Informationen aus String filtern

Raknar

Ensign
Registriert
Apr. 2006
Beiträge
204
Guten Abend,

ich sitze gerade daran aus einer Zeichenkette verschiedene Informationen herauszufiltern.

Die Zeichenkette kann wie folgt aufgebaut sein:

Code:
String: String; String; String: String; String; String; String:

Es geht darum, dass ein String vor einem Doppelpunkt zu einer Oberkategorie wird und alle anderen, die vor einem Semikolon stehen, zu einer Unterkategorie. Das sind leider die einzigen konstanten Muster.
Das letzte Zeichen kann ein Semikolon, ein Doppelpunkt oder der letzte Buchstabe einer Unterkategorie sein.
Eine Oberkategorie muss nicht immer eine Unterkategorie haben, umgekehrt schon. Leerzeichen können in den Teil-Strings vorkommen. Zwischen den Teil-Strings können sie auch vorkommen:
Code:
String:String; String;

Der Aufbau von oben noch mal etwas sprechender:
Code:
OK1: UK1_1; UK1_2; OK2: UK2_1; UK2_2; UK2_3; OK3:

Wenn ich jetzt die Split-Funktion benutze um nach Doppelpunkten aufzuteilen, ist es möglich, dass trotzdem Bezeichnungen von Oberkategorien in die Unterkategorie kommt.

Mein bisheriger Ansatz:
Code:
String[] tmpOM = omatchString.Split(':');
Int32 tmpOMlen = tmpOM.Length;

 foreach (String item in tmpOM)
{
     String[] abc = item.Split(';');
//todo
}

Ich brauche also einen Algorithmus, der mir das Ganze richtig auseinanderpflückt.

Hat jemand von euch eine Idee?
Vielen Dank schon mal im voraus.
 
ich würde
1) den doppelpunkt suchen und den int-wert speichern
2) von dem int-wert an den string zurückzählen, bis eben ein leerzeichen oder das semikolon kommt
3) dann vermutlich wieder bis zum nächsten doppelpunkt und die zeichen und leerzeichen zurück

substring wäre eine gute methode für sowas
 
ich würde mir einen string[] anlegen und dann den string folgendermaßen durchgehen:
1) ein i anlegen, das mir die gefundenen doppelpunkte zählt
2) string von links nach rechts durchgehen und an jedem doppelpunkt/strichpunkt schneiden
2a) bei doppelpunkt den teilstring in string[++i] schreiben.
2b) bei strichpunkt an den string in string anhängen
3)profit
 
Zuletzt bearbeitet:
Mein Vorschlag: Nach Leerzeichen splitten
1) Endet der Teilstring mit ; ist eine (neue) Oberkategorie, was folgt sind dessen Unterkategorien
2) Endet der Teilstring mit : ist es eine Unterkategorie
3) Endet der Teilstring mit einem Buchstaben ist der Rest der Unterkategorie im nächsten Teilstring oder es ist die letzte Unterkategorie
 
So, ich habs erst mal hinbekommen. Es ist zwar nicht sehr galant, wird aber auch nur ein Mal verwendet (Export einer uralten 16Bit BDE-Applikation^^)

OMatch = Oberkategorie
UMatch = Unterkategorie

Ich hätte noch sagen sollen, dass ein OMatch eine Liste mit UMatches in sich trägt.

Code:
List<OMatch> omatches = new List<OMatch>();
OMatch tmpOMatch = new OMatch();

while (omatchString.Contains(':') == true)
{                    
    Int32 dpPos = omatchString.LastIndexOf(':');//letzter Doppelpunkt
    if (dpPos != omatchString.Length - 1)//kommt danach noch etwas?
    {
        String allUM = omatchString.Substring(dpPos + 1, omatchString.Length - 1);
        if (allUM.Contains(';'))
        {
             foreach (String um in allUM.Split(';'))
             {
                 tmpOMatch.UMatchListe.Add(new UMatch { Bezeichnung = um });
              }
          }
          else //danach kommt ein String ohne ';' => als ein UM behandeln
          {
              tmpOMatch.UMatchListe.Add(new UMatch { Bezeichnung = allUM });
           }
      }
      else//kommt nichts mehr
      {
         // Nullbassiert und ':' am Ende auch weg 
         tmpOMatch.Bezeichnung = omatchString.Substring(0, omatchString.Length - 2);
       }

       omatchString = omatchString.Remove(dpPos);//ab letztem Doppelpunkt löschen
       if (omatchString.Contains(';'))
       {
            String[] lastElemIsOM = omatchString.Split(';');
            tmpOMatch.Bezeichnung = lastElemIsOM.Last();
        }

        omatches.Add(tmpOMatch);
}

Edit: Danke an alle. Besonders an tnoay. SubString und Zeichenkette von hinten löschen, waren die wichtigsten Überlegungen.
 
Zuletzt bearbeitet:
Zurück
Oben