2017-09-21 2 views
4

Sagen wir, ich mit Schlüssel/Wert-Paare ein Zeichen-Array haben:Kann Schlüssel/Wert-Paare in einer Struktur regexp zurückgeben?

ch = sprintf('name: John\nsex: M\n') 
ch = 
    'name: John 
    sex: M 
    ' 

Dies ist nur ein Beispiel. Die tatsächlichen Daten sind in einer Datei und haben viele Paare. Ich kann regexp verwenden Token zu bekommen, dann eine Verwendung für Schleife, sie zu einer Struktur zuzuordnen:

lns = regexp(ch, '(\w*):\s(.*?)\n', 'tokens'); 
for i = 1:numel(lns) 
    myStruct.(lns{i}{1}) = lns{i}{2}; 
end 

myStruct = 

    struct with fields: 

    name: 'John' 
    sex: 'M' 

Gibt es einen einfacheren Weg, dies zu erreichen, wie regexp(ch, expr, 'names') mit?

+0

Kennen Sie die Schlüssel im Voraus? Werden sie immer "Name" und "Sex" sein? – informaton

+0

Wenn wir _for_ loop vermeiden, kann dies möglicherweise die Leistung verbessern. –

+0

@informaton Ich kenne keine Schlüssel im Voraus. Aus der regexp-Dokumentation scheint es, dass bekannte Schlüssel benötigt werden. –

Antwort

5

Sie können die for-Schleife vermeiden, indem Sie Ihre Schlüssel/Wert-Paare in eine einzelne Zelle Array zu sammeln und dann vorbei an den Inhalt, dass als comma-separated list-struct:

args = [lns{:}]; 
myStruct = struct(args{:}); 

Und die Ausgabe:

myStruct = 

    struct with fields: 

    name: 'John' 
    sex: 'M' 

Alternativ können Sie die Verwendung von regexp vermeiden und verwenden textscan aus der Datei zu lesen, die die Leistung verbessern kann:

strs = textscan(fileID, '%s', 'Delimiter', ':'); 
myStruct = struct(strs{1}{:}); 
+0

Danke! Ich habe die Performance mit 75 Paaren getestet, das scheint etwas schneller zu sein als 'for' loop, obwohl der Unterschied sehr gering ist. –

+0

@XiangriLi: Ich habe eine Option mit 'textscan' anstelle von' regexp' hinzugefügt. Hoffentlich könnte das die Leistung steigern. – gnovice

+0

Das könnte schneller sein. Aber für meinen Fall kann ich '% s' nicht verwenden, da der 'Wert' Platz innerhalb von –

Verwandte Themen