Effacer les filtres
Effacer les filtres

Delete rows from a cell array based on key words

1 vue (au cours des 30 derniers jours)
Justin Rosenthal
Justin Rosenthal le 28 Jan 2022
Hello,
I have currently created a cell array that takes the following form:
'6440.016' 'hold'
'7378.016' 'max-pressure-evac 60.0'
'8372.016' 'max-pressure-evac 60.0'
'9365.016' 'max-pressure-evac 60.0'
'10357.016' 'max-pressure-evac 60.0'
'11338.016' 'max-pressure-evac 60.0'
'12298.016' 'max-pressure-evac 60.0'
'13259.016' 'max-pressure-evac 60.0'
'14221.016' 'max-pressure-evac 60.0'
'15184.016' 'max-pressure-evac 60.0'
'16149.016' 'max-pressure-evac 60.0'
'17115.016' 'max-pressure-evac 60.0'
'18082.016' 'max-pressure-evac 60.0'
'19050.016' 'max-pressure-evac 60.0'
'19424.016' 'hold-end'
'19553.016' 'hold'
'20272.016' 'max-pressure-evac 60.0'
'21109.016' 'max-pressure-evac 60.0'
'21919.016' 'hold-end'
'22048.016' 'hold'
'22651.016' 'max-pressure-evac 60.0'
'23374.016' 'max-pressure-evac 60.0'
'23489.016' 'hold-end'
'23619.016' 'hold'
'24131.016' 'max-pressure-evac 60.0'
'24762.016' 'max-pressure-evac 60.0'
'25060.016' 'hold-end'
'25190.016' 'hold'
'25640.016' 'max-pressure-evac 60.0'
'26212.016' 'max-pressure-evac 60.0'
'26631.016' 'hold-end'
If there are consecutive rows that say 'max-pressure-evac 60.0', I wish to only keep the final 'max-pressure-evac 60.0' and delete the ones above it. To clarify, here I have 5 different occaisons where 'max-pressure-evac 60.0' is repeated. Instead of having 21 'max-pressure-evac 60.0' rows I only want 5 which correspond to the time stamps of 19050, 21109, 23374, 24762, and 26212. I'm unable to wrap my mind around accomplishing this and any help would be greatly appreciated.

Réponse acceptée

Voss
Voss le 28 Jan 2022
data = { ...
'6440.016' 'hold'; ...
'7378.016' 'max-pressure-evac 60.0'; ...
'8372.016' 'max-pressure-evac 60.0'; ...
'9365.016' 'max-pressure-evac 60.0'; ...
'10357.016' 'max-pressure-evac 60.0'; ...
'11338.016' 'max-pressure-evac 60.0'; ...
'12298.016' 'max-pressure-evac 60.0'; ...
'13259.016' 'max-pressure-evac 60.0'; ...
'14221.016' 'max-pressure-evac 60.0'; ...
'15184.016' 'max-pressure-evac 60.0'; ...
'16149.016' 'max-pressure-evac 60.0'; ...
'17115.016' 'max-pressure-evac 60.0'; ...
'18082.016' 'max-pressure-evac 60.0'; ...
'19050.016' 'max-pressure-evac 60.0'; ...
'19424.016' 'hold-end'; ...
'19553.016' 'hold'; ...
'20272.016' 'max-pressure-evac 60.0'; ...
'21109.016' 'max-pressure-evac 60.0'; ...
'21919.016' 'hold-end'; ...
'22048.016' 'hold'; ...
'22651.016' 'max-pressure-evac 60.0'; ...
'23374.016' 'max-pressure-evac 60.0'; ...
'23489.016' 'hold-end'; ...
'23619.016' 'hold'; ...
'24131.016' 'max-pressure-evac 60.0'; ...
'24762.016' 'max-pressure-evac 60.0'; ...
'25060.016' 'hold-end'; ...
'25190.016' 'hold'; ...
'25640.016' 'max-pressure-evac 60.0'; ...
'26212.016' 'max-pressure-evac 60.0'; ...
'26631.016' 'hold-end'; ...
};
% gonna calculate the indices of the rows we want to keep.
% first make a vector of indices of all rows:
all_idx = 1:size(data,1);
% then find whether or not each row has 'max-pressure-evac 60.0':
idx = strcmp(data(:,2),'max-pressure-evac 60.0');
% now, keep those rows that do not say 'max-pressure-evac 60.0'
% (all_idx(~idx)), along with those rows that *do* say
% 'max-pressure-evac 60.0', if the next row says something else
% (or if it's the last row of data - there is no next row):
keep_idx = [all_idx(~idx) strfind([idx.' false],[true false])];
% grab those rows of data, in the right order:
new_data = data(sort(keep_idx),:);
disp(new_data);
{'6440.016' } {'hold' } {'19050.016'} {'max-pressure-evac 60.0'} {'19424.016'} {'hold-end' } {'19553.016'} {'hold' } {'21109.016'} {'max-pressure-evac 60.0'} {'21919.016'} {'hold-end' } {'22048.016'} {'hold' } {'23374.016'} {'max-pressure-evac 60.0'} {'23489.016'} {'hold-end' } {'23619.016'} {'hold' } {'24762.016'} {'max-pressure-evac 60.0'} {'25060.016'} {'hold-end' } {'25190.016'} {'hold' } {'26212.016'} {'max-pressure-evac 60.0'} {'26631.016'} {'hold-end' }
Showing the relevant intermediate variables' values so you can get a feel for how this works:
disp(idx.')
0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
disp(strfind([idx.' false],[true false]))
14 18 22 26 30
  1 commentaire
Justin Rosenthal
Justin Rosenthal le 28 Jan 2022
Thank you so much for your help this works perfectly!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Debugging and Analysis dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by