Compare and find multiple matching strings

19 views (last 30 days)
Xiaohan Du
Xiaohan Du on 22 Mar 2018
Commented: Xiaohan Du on 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?

Accepted Answer

Guillaume
Guillaume on 22 Mar 2018
Edited: Guillaume on 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 Comments
Xiaohan Du
Xiaohan Du on 22 Mar 2018
okay I got it, this is much better! Many thanks!

Sign in to comment.

More Answers (1)

thitch
thitch on 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

Community Treasure Hunt

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

Start Hunting!