Laden...

Probleme beim Text parsen

Erstellt von Toem99 vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.631 Views
T
Toem99 Themenstarter:in
511 Beiträge seit 2008
vor 14 Jahren
Probleme beim Text parsen

Morgen,

ich bekomme Textdateien mit folgendem Aufbau:

{ID: 17, Image: "Demo1.tif", Type: "TIFF", Width: 2436, Height: 3464, Length: 86437, CheckSum: d6241b81339e5d831d8c7202125b7db2}
{ID: 18, Tags: ["EIN", "BAUM", "WEIHNACHT"]}

Heißt, es befindet sich immer ein Key vor dem Doppelpunkt und dahinter folgt ein Value.

Wie parse ich jetzt den Text am einfachsten in Variablen?

Nicht für das Leben, für die Arbeit lernen wir ...
Windows ist Klasse, ich nehme es um Linux zu downloaden ....

D
68 Beiträge seit 2009
vor 14 Jahren

Moin Toem99,

ich würde die {} per Trim() entfernen, dann Regex.Split() nach , oder :
dann hast du die elemente getrennt.


        string input = DEINTEXT.ToCharArray());
        string[] arr = Regex.Split(input,",|:"); 

Das einzige problem ist halt, dass deine tags auch durch kommas getrennt sind, aber so hast du jedenfalls schon mal ein array ind dem im ersten feld ein key und im zweiten feld der zugehörige value steht usw. (bis auf die tags halt)...

EDIT: das problem mit den kommas in den tags könntest du lösen, indem du die kommas in den tags z.b. durch ; ersetzt:


    input = Regex.Replace(input, @"(?<=\[.+),", ";");

einfach zwischen die beiden zeilen oben...

MfG

DickesB

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Toem99,

Regex ist schon das richtige, aber Split würde ich nicht verwenden, sondern einen vernünftigen Pattern für ein Key-Value-Pair schreiben und Key und Value dann aus den entsprechenden Gruppen auslesen. Dann kann man auch Kommas innerhalb von Anführungsstrichen korrekt behandeln.

Hallo DickesB,

EDIT: das problem mit den kommas in den tags könntest du lösen, indem du die kommas in den tags z.b. durch ; ersetzt:

das ist doch rumgebastelt und bei meinem Vorschlag auch nicht nötig.

herbivore

T
Toem99 Themenstarter:in
511 Beiträge seit 2008
vor 14 Jahren

sondern einen vernünftigen Pattern für ein Key-Value-Pair schreiben

Kannst Du mir das näher erklären oder ein Codebeispiel geben?

Nicht für das Leben, für die Arbeit lernen wir ...
Windows ist Klasse, ich nehme es um Linux zu downloaden ....

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Toem99,

ich wüsste nicht, was ich da noch erklären könnte, zumindest wenn ich mal voraussetze, dass bekannt ist, was Regex und Pattern sind. Wenn nicht, dann siehe [Artikel] Regex-Tutorial.

herbivore

F
10.010 Beiträge seit 2004
vor 14 Jahren

@Toem99:
Da das JSON ist, würde ich einen vorhandenen JSON Parser nehmen.

D
68 Beiträge seit 2009
vor 14 Jahren

Hallo herbivore,

du hast natürlich Recht! War nur so schnell dahingedacht...

Hallo Toem99,

mit diesem Pattern sollte das so gehn, wie herbivore gesagthat: ([A-Za-z]+):(.+?(?=(?<![.+),|}))

da kannst du dann aus match.Group[1] den Key holen und aus match.Group[2] den Value...

MfG

DickesB

T
Toem99 Themenstarter:in
511 Beiträge seit 2008
vor 14 Jahren

mmh, irgendwie funkt das Pattern bei mir nicht.
Es stehen trotzdem alle Werte komplett in einem Eintrag.

Nicht für das Leben, für die Arbeit lernen wir ...
Windows ist Klasse, ich nehme es um Linux zu downloaden ....

D
68 Beiträge seit 2009
vor 14 Jahren

was meinst du mit in einem eintrag? im match.Value? oder in match.Groups[0].Value? falls es so ist dann is ja klar...

teste das am besten doch nochmal mit dem Regex-Lab

damit hab ich das pattern erstellt und wie gesagt stehen die keys dann in Group[1] und die values in Group[2]...

also so ungefähr:


            Regex matcher = new Regex(@"([A-Za-z]+):(.+?(?=(?<!\[.+),|}))");
            foreach (Match m in matcher.Matches(input))
            {
                string key = m.Groups[1].Value;
                string value = m.Groups[2].Value;
            }

T
Toem99 Themenstarter:in
511 Beiträge seit 2008
vor 14 Jahren

mmh, den Regex-Lab hab ich mir grade runtergeladen. Aber komischerweise kann ich dort eintragen, was ich will, ich bekomme überhaupt keine Pattern oder sonst was angezeigt.
😦

Nicht für das Leben, für die Arbeit lernen wir ...
Windows ist Klasse, ich nehme es um Linux zu downloaden ....

D
68 Beiträge seit 2009
vor 14 Jahren

bei input deinen text von oben eingetragen?
bei pattern mein pattern?
dann zeigt er bei mir unten die korrekten groups...

und der codeschnipsel funktioniert bei mir auch wie gewünscht!

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo Toem99,

Da das JSON ist, würde ich einen vorhandenen JSON Parser nehmen.

Genau, warum umständlich was mit Regex zusammenbasteln, wenn es schon Parser dafür gibt. Zumal in JSON die Datentypen auch beliebig verschachtelt sein können - für Verschachtelungen ist Regex nicht mächtig genug.

Nimm z.B. den System.Web.Script.Serialization.JavaScriptSerializer direkt aus dem Framework (System.Web.Extensions.dll):


public class Foo
{
	public int ID { get; set; }
	public string Image { get; set; }
	public string Type { get; set; }
	public int Width { get; set; }
	public int Height { get; set; }
	public int Length { get; set; }
	public string Checksum { get; set; }
	public List<string> Tags { get; set; }
}

// ...

string one = @"{ID: 17, Image: ""Demo1.tif"", Type: ""TIFF"", Width: 2436, Height: 3464, Length: 86437, CheckSum: ""d6241b81339e5d831d8c7202125b7db2"" }";
string two = @"{ID: 18, Tags: [""EIN"", ""BAUM"", ""WEIHNACHT""]}";

JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();

Foo oneFoo = javaScriptSerializer.Deserialize<Foo>(one);
Foo twoFoo = javaScriptSerializer.Deserialize<Foo>(two);
Dictionary<string,object> oneDict = javaScriptSerializer.Deserialize<Dictionary<string,object>>(one);
Dictionary<string,object> twoDict = javaScriptSerializer.Deserialize<Dictionary<string,object>>(two);

Allerdings wird CheckSum ohne Anführungsstriche drumrum nicht erkannt(!)

Gruß,
dN!3L