more efficient way to use strtok / selecting parts of a string

5 views (last 30 days)
Greetings,
I have a huge cell array with time data arranged in the following format :
[one empty cell];
ABC/DEF QTR/3/99 (Thousands);
ABC/DEF QTR/6/99 (Thousands);
ABC/DEF QTR/9/99 (Thousands);
ABC/DEF QTR/12/99 (Thousands);
etc...
I would like to change the format into this :
ABC/DEF;
QTR/3/99;
QTR/6/99;
QTR/9/99;
QTR/12/99;
etc...
I've solved the problem but think it can be done much more efficiently:
[varname, mthtime2(2:end)] = strtok(mthtime2(2:end));
mthtime2(2:end)= strtok(mthtime2(2:end));% drops the "thousands" mthtime2(1)=varname(1);
Suggestions for a faster method would be most appreciated. Thank you for your time!
Iliya
  2 Comments
Walter Roberson
Walter Roberson on 28 Jan 2012
Is the mthtime2(1)=varname(1) commented out, or should it be on the next line?
Daniel Shub
Daniel Shub on 28 Jan 2012
In order to get what iilya wants, mthtime2(1)=varname(1) needs to be uncommented.

Sign in to comment.

Accepted Answer

Daniel Shub
Daniel Shub on 28 Jan 2012
If the format is as rigid as your example ...
Given a cell array
x = {[]; 'ABC/DEF QTR/3/99 (Thousands)'; 'ABC/DEF QTR/6/99 (Thousands)'; 'ABC/DEF QTR/9/99 (Thousands)'; 'ABC/DEF QTR/12/99 (Thousands)'};
Then for each element
y = x{i};
you want
y(9:17);
and then need to deal with the possible blank space. The function deblank can handle this. Putting it all together ...
x = {[]; 'ABC/DEF QTR/3/99 (Thousands)'; 'ABC/DEF QTR/6/99 (Thousands)'; 'ABC/DEF QTR/9/99 (Thousands)'; 'ABC/DEF QTR/12/99 (Thousands)'};
[{'ABC/DEF'};cellfun(@(y)(deblank(y(9:17))), x(2:end), 'UniformOutput', false)]
edit to handle variable ABC/DEF
firstCell = x{2};
[{firstCell(1:7)};cellfun(@(y)(deblank(y(9:17))), x(2:end), 'UniformOutput', false)]

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!