Compare and find multiple matching strings
    4 次查看(过去 30 天)
  
       显示 更早的评论
    
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?
0 个评论
采纳的回答
  Guillaume
      
      
 2018-3-22
        
      编辑:Guillaume
      
      
 2018-3-22
  
      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 个评论
  Guillaume
      
      
 2018-3-22
				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.
更多回答(1 个)
  thitch
      
 2018-3-22
        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
另请参阅
类别
				在 Help Center 和 File Exchange 中查找有关 Data Type Conversion 的更多信息
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!