none
Dictionary, Keys, nur Values ändern, Split oder RegEx, Ansätze RRS feed

  • Frage

  • Hallo,
     
    folgendes Problem.
    Ich habe ein dictionary mit Keys, muss diese auslesen, ändern, befüllen.
     
    a) Items parsen, analysieren, Split oder RegEx, was bietet sich hier an?
    b) Keys bleiben, nur die Items bleiben.
     
    Danke vorab für Tipps. Hoffe das Problem verstanden.
     
      Viele Grüße Ulrich
     
    dictionary
       Key
       Item
     
       key = MultipleStruct
       Item = _VAR_DatumsVariable_VAR_END__VAR_AuftragsnummerVariable_VAR_END__VAR_ProduktVariable_VAR_END_
     
       key = SimpleStruct
       Item = _VAR_LagerVariable_VAR_END_
     
     
    _VAR_ Anfangskennung
    _VAR_END_  Endekennung
     
    Ziel:
    Die Item Einträge aufzulösen
    Erst mal so
    • DatumsVariable
    • AuftragsnummerVariable
    • ProduktVariable
    Dann füllen – ZIEL
    Key  MultipleStruct
    Item 19032016Order4569Receiver
     
    Key  SimpleStruct
    Item LagerA5_Etage7_Fach8

    • Bearbeitet Ulrich Stippe Samstag, 19. März 2016 12:31 Korrektur Titel
    Samstag, 19. März 2016 11:19

Antworten

  • Hi Ulrich,

    Ja ,das siehst Du richtig^.

    Dochdoch, das Tool geht schon:

    C# würde so aussehen:

    	string input = "VAR_DatumsVariable_VAR_END__VAR_AuftragsnummerVariable_VAR_END__VAR_ProduktVariable_VAR_END_";
    	string pattern = @"(?<=VAR_)[^_]*(?=_VAR)";
    	var m = Regex.Matches(input, pattern);
    GrussMM


    PS: Please mark as answer if helpful. Thanks!
    Blog: http://www.manuelmeyer.net
    Twitter: https://twitter.com/manumeyer1

    • Als Antwort markiert Ulrich Stippe Dienstag, 22. März 2016 17:46
    Dienstag, 22. März 2016 12:23

Alle Antworten

  • Hi Ulrich,
    Keys ändern geht in einem Dictionary nicht. Da muss man entfernen und neu hinzufügen. Werte kann man zu jedem Key beliebig ändern. Bei so einer Fragestellung ist es vielleicht auch bedenkenswert, alles über Listen zu machen. Da ist das Ändern einfacher. Bei Bedarf kann man eine Schlüsseleigenschaft dann als Schlüssel für das Wörterbuch nehmen.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen!
    Schüler sagen, Lehrer haben es gut.
    Schüler, sagen Lehrer, haben es gut

    Samstag, 19. März 2016 12:11
  • Hallo Ulrich,

    "Ich habe ein dictionary mit Keys, muss diese auslesen, ändern, befüllen."

    Meine Lesart wäre: Du willst die "Keys" ändern, aber das Thema hatten wir ja schon einmal :)

    Ein Dictionary besteht aus Keys und Values, immer paarweise, den "Key-Value-Paaren". Die Keys sind sozusagen die Suchbegriffe, mit denen du auf deine Values zugreifen möchtest. Beispiel: Key = Artikelnummern, Value = Object_mit_Artikeldaten.

    "a) Items parsen, analysieren, Split oder RegEx, was bietet sich hier an?"
    Was ist für dich rin "Item"? Vermutlich der "Value" eines "Key-Value-Paares"?

    "b) Keys bleiben, nur die Items bleiben."
    Verstehe ich nicht.

    Ein Dictionary<T1,T2> hat ja das besondere Merkmal, dass die Typen für Key und Value festgelegt werden. Und dann nicht mehr veränderlich sind.

    Falls ich dich nun richtig verstehe, möchtest du aber unterschiedliche "Strukturen" in deinen Values speichern, du nennst die "MultipleStruct" oder "SimpleStruct". Also, eigentlich sollen verschiedene "Typen" für einen Value-Eintrag möglich sein, z.B:

    class Typ1 {
      public DateTime datum;
      public string auftragNr;
      ...
    }

    class Typ2 {
      public string lager;
      public string etage;
      ...
    }

    Du könntest jetzt ein Dictionary<TKey, object> erstellen und wärest dann frei, beliebige Object in den "Values" abzulegen, z.B. dict.Add("abc1", new Typ1(...)), dict.Add("abc9", new Typ2(...)) etc.

    Dein aktueller Weg sieht danach aus, ein Dictionary<string, string> zu verwenden und die verschieden "Typen" als serialisierte Strings abzulegen. Wenn ich es richtig sehe, verwendest du ein eigenes Format dafür und definierst dir eigene "Delimiter". Du könntest natürlich auch bekannte Formate nehmen, z.B. XML oder Json.

    So wirklich ideal ist das aber beides nicht. Hättest du nicht die Möglichkeit, für die beiden (oder weitere) Typen jeweils ein Dictionary<string, Typ1> und Dictionary<string, Typ2> zu verwenden?

    Sonst müsstest du ja irgendwie bei jedem Zugriff jeden Value erst irgendwie wieder "deserialisieren" oder casten.

    Gruß
    Samstag, 19. März 2016 12:16

  • So wirklich ideal ist das aber beides nicht. Hättest du nicht die Möglichkeit, für die beiden (oder weitere) Typen jeweils ein Dictionary<string, Typ1> und Dictionary<string, Typ2> zu verwenden?

    Sonst müsstest du ja irgendwie bei jedem Zugriff jeden Value erst irgendwie wieder "deserialisieren" oder casten.

    Hallo K. Pater,

    ja wir hatten das Thema schon mal ähnlich. Ich will nicht die Keys ändern, nur deren Values.

    Ich muss das Dictionary mit den Keys iterieren.

    Ich weiß nicht was kommt.

    _VAR_DatumsVariable_VAR_END__VAR_AuftragsnummerVariable_VAR_END__VAR_ProduktVariable_VAR_END_

    Es kann auch eine SAP Nummer sein etc. Es muss flexibel sein.

    Könnte evtl. eine RegEx. das Splitten erleichtern?

    ZIEL:

    dictionaryIST
       Key

       Item

    dictionarySOLL
       Key    - wie IST, keine Änderungen

       Item  - hier nur der Gesamtstring.

    Hoffe nun klarer.

    Viele Grüße Ulrich

    Samstag, 19. März 2016 12:30
  • Hallo Ulrich,

    ich verstehe den Ablauf jetzt so:

    Du bekommst einen String angeliefert in der Form

    _VAR_DatumsVariable_VAR_END__VAR_AuftragsnummerVariable_VAR_END__VAR_ProduktVariable_VAR_END_

    und es ist klar, dass dies zu einem ganz bestimmten Key in deinem Dictionary gehört.

    char Separator = '|';
    data = data.Replace("_VAR_END_", Separator.ToString());
    data = data.Replace("_VAR_", "");
    string[] flds = data.Split(new char[] { Separator });

    Nun wäre der String grob zerlegt, flds enthält die einzelnen Werte.

    Dann füllen – ZIEL
    Key  MultipleStruct
    Item 19032016Order4569Receiver

    Und nun soll das wieder zu einem String zusammengeführt und dem Value zugeordnet werden? Wie willst du denn dann auf die einzelnen Felder zugreifen?

    Wäre es nicht sinnvoller, für jeden unterscheidbaren Quell-String eine Klasse zu erstellen, also AuftragsItem, SAPItem, etc. und über entsprechende Instanzen die einzelnen, spezifischen Felder verfügbar zu machen?

    Gruß

    Samstag, 19. März 2016 15:05
  • Du bekommst einen String angeliefert in der Form

    _VAR_DatumsVariable_VAR_END__VAR_AuftragsnummerVariable_VAR_END__VAR_ProduktVariable_VAR_END_

    Wäre es nicht sinnvoller, für jeden unterscheidbaren Quell-String eine Klasse zu erstellen, also AuftragsItem, SAPItem, etc. und über entsprechende Instanzen die einzelnen, spezifischen Felder verfügbar zu machen?

    Hallo K.Pater,

    ja richtig verstanden.

    Ich kann keine Klasse für den String erstellen, da ich nicht weiß was kommt.

    Beispiel:

       Ich stoße auf diese Variable AuftragsnummerVariable

       Dann schaue ich im Verzeichnis C:\Exchange\Inhalt\AuftragsnummerVariable.XML nach was da drin steht.

          Das mit allen anderen auch. Danach baue ich einen Gesamtstring und gebe diesen weiter.

    D.h. ich habe ein Dictionary key - item

    Der Key ändert sich nicht, nur die Values.

     Dictionary ca. 10 Keys mit n Variablen, damit man im Prozess schnell zugreifen kann. Wie würdest Du das Dictionary abschließend durchlaufen und die Values modifizieren? Kennst Du Dich mit der RegEx aus als Ersatz für Split, wobei ich auch denke Split ist hier doch besser, nur als Vergleich.

    Viele Grüße und Danke Ulrich


    Samstag, 19. März 2016 16:37
  • Hallo Ulrich,

    Wenn Du nur die texte mit "_VAR_END__VAR_" oder "_VAR_" rausnehmen musst, dann gehts mit Replace() am besten. Regex wäre etwas komplizierter.

    Du müsstest dann Regexen schreiben, welche den Text finden, der Zwischen den Platzhaltern ist. Das ist schon etwas umständlich, geht aber auch.

    Mit der Regex:

    (?<=VAR_)[^_]*(?=_VAR)

    Würdest Du aus diesem Text:

    VAR_DatumsVariable_VAR_END__VAR_AuftragsnummerVariable_VAR_END__VAR_ProduktVariable_VAR_END_

    Die Werte zwischen den Platzhaltern rauskriegen. Kannst Du bspw. hier ausprobieren:

    http://nregex.com/

    Die Regex heisst in etwa: "Finde alle Wörter, die aus allen Zeichen ausser dem Underscore bestehen und auf VAR_ folgen und mit _VAR enden.

    Regex machen dann Sinn, wenn Du bspw. Definition, was Du im string finden musst in die Config auslagerst, weil Du sie ohne Neukompilation ändern willst. Falls nicht -> Replace().

    Gruss MM


    PS: Please mark as answer if helpful. Thanks!
    Blog: http://www.manuelmeyer.net
    Twitter: https://twitter.com/manumeyer1

    Sonntag, 20. März 2016 20:18
  • Hallo Manuel,
    ich habe mich für die Split, Replace Methode entschieden.
    Splitten tut die RegEx, ich müßte dann ja auch noch zusätzlich Replace machen.
    Sehe ich doch richtig.

    Viele Grüße Ulrich

    RegEx

    P.S. Dein Tool geht gar nicht. Ich meine das obige ist besser.
         Was fehlt ist vielleicht noch der passende C# Code, falls Du da noch was kennst.
    Montag, 21. März 2016 17:32
  • Hi Ulrich,

    Ja ,das siehst Du richtig^.

    Dochdoch, das Tool geht schon:

    C# würde so aussehen:

    	string input = "VAR_DatumsVariable_VAR_END__VAR_AuftragsnummerVariable_VAR_END__VAR_ProduktVariable_VAR_END_";
    	string pattern = @"(?<=VAR_)[^_]*(?=_VAR)";
    	var m = Regex.Matches(input, pattern);
    GrussMM


    PS: Please mark as answer if helpful. Thanks!
    Blog: http://www.manuelmeyer.net
    Twitter: https://twitter.com/manumeyer1

    • Als Antwort markiert Ulrich Stippe Dienstag, 22. März 2016 17:46
    Dienstag, 22. März 2016 12:23
  • VAR_DatumsVariable_VAR_END__VAR_AuftragsnummerVariable_VAR_END__VAR_ProduktVariable_VAR_END_
    (?<=VAR_)[^_]*(?=_VAR)

    Hallo Manuel,
    ich hab's nochmals getestet. Durch diverses Klicken hat es dann doch noch funktioniert.
    Danke.
    Viele Grüße Ulrich
    Dienstag, 22. März 2016 17:46