regexmatlabcharcell-arrayunits-of-measurement

Removing Measurement Units from Cell Array


I am trying to remove the units out of a column of cell array data i.e.:

cArray =
time                 temp
2022-05-10 20:19:43  '167 °F'
2022-05-10 20:19:53  '173 °F'
2022-05-10 20:20:03  '177 °F'
...
2022-06-09 20:18:10  '161 °F'

I have tried str2double but get all NaN.

I have found some info on regexp but don't follow exactly as the example is not the same.

Can anyone help me get the temp column to only read the value i.e.:

cArray =
time                 temp
2022-05-10 20:19:43  167
2022-05-10 20:19:53  173
2022-05-10 20:20:03  177
...
2022-06-09 20:18:10  161

Solution

  • For some cell array of data

    cArray = { ...
      1,   '123 °F'
      2,   '234 °F'
      3,   '345 °F'
      };
    

    The easiest option is if we can safely assume the temperature data always starts with numeric values, and you want all of the numeric values. Then we can use regex to match only numbers

    temps = regexp( cArray(:,2), '\d+', 'match', 'once' );
    

    The match option causes regexp to return the matching string rather than the index of the match, and once means "stop at the first match" so that we ignore everything after the first non-numeric character.

    The pattern '\d+' means "one or more numbers". You could expand it to match numbers with a decimal part using '\d+(\.\d+)?' instead if that's a requirement.

    Then if you want to actually output numbers, you should use str2double. You could do this in a loop, or use cellfun which is a compact way of achieving the same thing.

    temps = cellfun( @str2double, temps, 'uni', 0 ); % 'uni'=0 to retain cell array
    

    Finally you can override the column in cArray

    cArray(:,2) = temps;