2017-09-21 4 views
4

Disons que j'ai un tableau de caractères avec des paires clé/valeur:Peut regexp retourner des paires clé/valeur dans une structure?

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

Ceci est juste un échantillon. Les données réelles sont dans un fichier et ont plusieurs paires. Je peux utiliser regexp pour obtenir des jetons, puis utiliser une boucle pour les affecter à une structure:

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' 

est-il un moyen plus simple d'y parvenir, comme l'utilisation regexp(ch, expr, 'names')?

+0

Connaissez-vous les clés à l'avance? Autrement dit, seront-ils toujours «nom» et «sexe»? – informaton

+0

Si nous évitons _for_ loop, cela peut potentiellement améliorer les performances au moins. –

+0

@informaton Je ne connais pas les clés à l'avance. De la documentation regexp, il semble que les clés connues sont nécessaires. –

Répondre

5

Vous pouvez éviter la boucle en collectant vos paires clé/valeur en une seule matrice de cellules et en faisant passer le contenu de ce comme comma-separated list-struct:

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

Et la sortie:

myStruct = 

    struct with fields: 

    name: 'John' 
    sex: 'M' 

Sinon, vous pouvez éviter l'utilisation de regexp et utiliser textscan pour lire à partir du fichier, ce qui peut améliorer les performances:

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

Merci! J'ai testé la performance, avec 75 paires, cela semble un peu plus rapide que la boucle 'for', bien que la différence soit très mineure. –

+0

@XiangruiLi: J'ai ajouté une option en utilisant 'textscan' au lieu de' regexp'. J'espère que cela pourrait améliorer les performances. – gnovice

+0

Cela pourrait être plus rapide. Mais pour mon cas, je ne peux pas utiliser '% s', puisque le 'value' peut avoir de l'espace à l'intérieur –