Benutzer mit den meisten Antworten
Dictionary, Keys, nur Values ändern, Split oder RegEx, Ansätze

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 UlrichdictionaryKeyItemkey = MultipleStructItem = _VAR_DatumsVariable_VAR_END__VAR_AuftragsnummerVariable_VAR_END__VAR_ProduktVariable_VAR_END_key = SimpleStructItem = _VAR_LagerVariable_VAR_END__VAR_ Anfangskennung_VAR_END_ EndekennungZiel:Die Item Einträge aufzulösenErst mal so
- DatumsVariable
- AuftragsnummerVariable
- ProduktVariable
Dann füllen – ZIELKey MultipleStructItem 19032016Order4569ReceiverKey SimpleStructItem LagerA5_Etage7_Fach8- Bearbeitet Ulrich Stippe Samstag, 19. März 2016 12:31 Korrektur Titel
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
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 -
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ß -
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:
dictionaryISTKeyItem
dictionarySOLLKey - wie IST, keine ÄnderungenItem - hier nur der Gesamtstring.
Hoffe nun klarer.
Viele Grüße Ulrich
-
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ß
-
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
- Bearbeitet Ulrich Stippe Samstag, 19. März 2016 16:40
-
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:
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 -
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
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. -
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
-