Azzera filtri
Azzera filtri

match a word/string

8 visualizzazioni (ultimi 30 giorni)
Bharat
Bharat il 26 Nov 2014
Modificato: per isakson il 27 Nov 2014
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 Commenti
Bharat
Bharat il 27 Nov 2014
Sorry Geoff, I am new to matlab and this site. I apologize that I didn't post the query properly.
Image Analyst
Image Analyst il 27 Nov 2014
Modificato: Image Analyst il 27 Nov 2014
Well you didn't have a closing apostrophe on the "if" line. But why not just use my answer?

Accedi per commentare.

Risposta accettata

per isakson
per isakson il 27 Nov 2014
Modificato: per isakson il 27 Nov 2014
if file(i,1)=='GDD51' &nbsp 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,&nbsp if&nbsp of recent Matlab versions applies an implicit&nbsp all. &nbsp 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 Commenti
Image Analyst
Image Analyst il 27 Nov 2014
Any reason why you chose not to use ismember(), which is how I think most MATLABers would do it?
per isakson
per isakson il 27 Nov 2014
Modificato: per isakson il 27 Nov 2014
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.

Accedi per commentare.

Più risposte (1)

Image Analyst
Image Analyst il 26 Nov 2014
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 Commento
Image Analyst
Image Analyst il 27 Nov 2014
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);

Accedi per commentare.

Categorie

Scopri di più su Characters and Strings in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by