Compare and find multiple matching strings

17 vues (au cours des 30 derniers jours)
Xiaohan Du
Xiaohan Du le 22 Mar 2018
Commenté : Xiaohan Du le 22 Mar 2018
Hi all,
I have a text file (.inp) from Abaqus, where I need to find the line number of some strings. I read the file using 'fopen' and 'textscan' into MATLAB, results in string cells. The file looks like this:
rawInpStr
rawInpStr =
1×1 cell array
{1557×1 cell}
rawInpStr{:} =
{'*Heading' }
{'** Job name: l9h2SingleInc Model name: Model-1' }
{'** Generated by: Abaqus/CAE 6.12-4' }
{'*Preprint, echo=NO, model=NO, history=NO, contact=NO' }
{'** PARTS' }
{'*Part, name=beam' }
{'*End Part' }
{'** ASSEMBLY' }
{'*Assembly, name=Assembly' }
{'*Instance, name=beam-1, part=beam' }
{'*Node' }
......
For example, if I need to find 3 lines matching '** Job name', '** PARTS', '*End Part', I write:
for iStr = 1:length(rawInpStr{1})
strComp = strtrim(rawInpStr{1}{iStr});
if length(strComp) > 10
if strcmp(strComp(1:11), '** Job name') == 1
loc1 = iStr;
end
end
if length(strComp) > 7
if strcmp(strComp(1:8), '** PARTS') == 1
loc2 = iStr;
end
end
if length(strComp) > 8
if strcmp(strComp(1:9), '*End Part') == 1
loc3 = iStr;
end
end
end
So for N strings I'd want to find, I need N for loops. Is there a more elegant way to do this?

Réponse acceptée

Guillaume
Guillaume le 22 Mar 2018
Modifié(e) : Guillaume le 22 Mar 2018
The loop was never needed in the first place:
loc1 = find(strncmp(rawInpStr{1}, '** Job name', 11))
For several search strings, you can loop over your search strings (or use cellfun):
searchstrings = {'** Job name', '** PARTS', '*End part'};
locs = cell(size(searchstrings); %using a cell array in case the search string is found several time through the file
for searchidx = 1:numel(searchstrings)
locs{searchidx} = find(strncmp(rawInpStr{1}, searchstrings{searchidx}, numel(searchstrings{searchidx})));
end
Note that if your ultimate goal is to find a pattern over several lines, then I would take a completely different approach.
edit: As you can gather from my answer, for what you're doing strncmp is a lot more useful than strcmp.
editedit: Used the proper variables.
  3 commentaires
Guillaume
Guillaume le 22 Mar 2018
Yes, the loop was never needed in the first place, strncmp (and strcmp) can work directly on the whole cell array. However, I read your code too quickly and didn't realise that strComp was only one element of the cell array. The proper example should have been:
loc1 = find(strncmp(rawInpStr{1}, '** Job name', 11));
Same for the full solution, use rawInpStr{1} directly. I've fixed my answer.
Xiaohan Du
Xiaohan Du le 22 Mar 2018
okay I got it, this is much better! Many thanks!

Connectez-vous pour commenter.

Plus de réponses (1)

thitch
thitch le 22 Mar 2018
The following may help to get you started:
rawInpStr = {'cat','dog','whale'};
mySearchTerms = {'cat','dog','whale','camel'};
foundOnLine = zeros(size(rawInpStr,2),size(mySearchTerms,2));
for lv1 = 1:size(mySearchTerms,2)
foundOnLine(:,lv1) = cellfun(@(x) strcmp(x,mySearchTerms{lv1}),rawInpStr);
end

Catégories

En savoir plus sur Startup and Shutdown 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