4

Let's say I have a character array with key/value pairs:

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

This is just a sample. The actual data is in a file and has many pairs. I can use regexp to get tokens, then use a for loop to assign them to a 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'

Is there a simpler way to achieve this, like using regexp(ch, expr, 'names')?

gnovice
  • 125,304
  • 15
  • 256
  • 359
Xiangrui Li
  • 2,386
  • 2
  • 13
  • 17

1 Answers1

5

You can avoid the for loop by collecting your key/value pairs into a single cell array and then passing the contents of that as a comma-separated list to struct:

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

And the output:

myStruct = 

  struct with fields:

    name: 'John'
     sex: 'M'

Alternatively, you could avoid the use of regexp and use textscan to read from the file, which may improve performance:

strs = textscan(fileID, '%s', 'Delimiter', ':');
myStruct = struct(strs{1}{:});
gnovice
  • 125,304
  • 15
  • 256
  • 359