match a word/string
8 ビュー (過去 30 日間)
古いコメントを表示
Hi all. I have a file, in which the first column which contains 27k rows of words/strings. (eg:GDD51). I need to search a particular string and create another file with all values corresponding to the second column in that file. The problem is, i can't search for a string. It says error! Can someone help me. this is the code i used:
x=0;
for i=1:27099
if file(i,1)=='GDD51
x=x+1;
newfile(x,1)=file(i,2);
end
end
And i get this error: Undefined function 'eq' for input arguments of type 'table'. Please help,Thanks
3 件のコメント
Image Analyst
2014 年 11 月 27 日
編集済み: Image Analyst
2014 年 11 月 27 日
Well you didn't have a closing apostrophe on the "if" line. But why not just use my answer?
採用された回答
per isakson
2014 年 11 月 27 日
編集済み: per isakson
2014 年 11 月 27 日
if file(i,1)=='GDD51'   will not work for two reasons
Firstly, the comparison is made position by position. The result is a vector of logical. To assert identical strings all must be true.
>> 'ABC'=='AAA'
ans =
1 0 0
>> all( 'ABC'=='AAA' )
ans =
0
However,  if  of recent Matlab versions applies an implicit  all.   That was not always the case(?). See if, elseif, else
[...] An expression is true when its result is nonempty and contains
only nonzero elements (logical or real numeric).
Secondly, the strings must have the same length else an error is thrown
>> 'ABC'=='AABCA'
Error using ==
Matrix dimensions must agree.
I think, the best code is (not tested)
>> newfile = file( strcmp( 'GDD51', file(:,1) ), 2 );
3 件のコメント
Image Analyst
2014 年 11 月 27 日
Any reason why you chose not to use ismember(), which is how I think most MATLABers would do it?
per isakson
2014 年 11 月 27 日
編集済み: per isakson
2014 年 11 月 27 日
According to my old rule of thumb
ism = strcmp( str, cell_array_of_strings );
is significantly faster than
ism = ismember( str, cell_array_of_strings );
(This is a special case to ismember)
However, that might have changed.
その他の回答 (1 件)
Image Analyst
2014 年 11 月 26 日
Try this:
% Create sample data
cellArrayOfStrings = {'No Match this index', 'GDD51', 'no match here either'};
% Find index where cell contents = 'GDD51'
index = ismember(cellArrayOfStrings, 'GDD51')
1 件のコメント
Image Analyst
2014 年 11 月 27 日
Regarding your edit for making a file of the second column where it's true
fid = fopen(filename, 'wt');
for k = 1 : length(index)
if index(k)
fprintf(fid, '%s\n', cellArrayOfStrings{k});
end
end
fclose(fid);
参考
カテゴリ
Help Center および File Exchange で Characters and Strings についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!