Error using contains - First argument must be a string array...
19 views (last 30 days)
Show older comments
Hello!
I am at my wits end trying to get this code to work.
I am basically trying to take some data from a .txt file and transpose it into a 3 column tab delimited matrix.
The error I receive is:
"Error using contains (line 39)
First argument must be a string array, character vector, or cell array of character vectors.
Error in read_logfiles (line 53)
while (~contains(oneline,'Target Condition:'))oneline = fgetl(datafid); end"
The information I'm asking it to look at is definitely a string that says "Parnter" "Stranger" or "Friend"
So, for instance, one of these in the .txt file I'm asking it to read would look like "Target Condition: Stranger"
This script was given to me by my lab director with little instruction other than to make it work.
I apologize for posting the entire script like this but I'm really not sure what the problem is.
Any help would really be appreciated!
% 1. Read in 3 e-prime text logfiles for one subject.
% 2. Output 9 onset files (3 conditions * 1 runs).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
EXP_DIR = 'E:/Matlab1';
if length(subject==4) subject = subject(2:end); end
subject_dir = fullfile(EXP_DIR,sprintf('s%s',subject));
ONS_SAVE_DIR = subject_dir;
if ~exist('data_dir','var') data_dir=fullfile(subject_dir,'logfiles'); end
DATADIR = fullfile(EXP_DIR,'data');
DATAFILE_PRE = {'CRT1-142'};
DATAFILE_SUF = '-1.txt';
num_runs = 1;
files_to_read = num_runs;
trials_per_file = 8;
%onsets are in seconds from the beginning of run (starting after the 10s
%fixation)
event_onset_list = zeros(3, trials_per_file * 6); %X events per trial: EVENT1, EVENT2, EVENT3, etc.
weights_list = ones(3, trials_per_file * 6);
%condition_list = zeros(3, trials_per_file * X);
duration_list = zeros(3, trials_per_file * 6);
Friend_mask = false(3, trials_per_file * 6);
Stranger_mask = false(3, trials_per_file * 6);
Partner_mask = false(3, trials_per_file * 6);
for ifile = 1:files_to_read
trialnum = 0;
seconds_from_start = 0;
%open file (convert to ascii first)
if ~exist(fullfile(DATADIR,[DATAFILE_PRE{ifile} subject DATAFILE_SUF]),'file')
error(sprintf('cannot find file %s',fullfile(DATADIR,[DATAFILE_PRE{ifile} subject DATAFILE_SUF])));
end
unicode2ascii(fullfile(DATADIR,[DATAFILE_PRE{ifile} subject DATAFILE_SUF]),fullfile(DATADIR,[DATAFILE_PRE{ifile} subject 'ascii' DATAFILE_SUF]));
datafid = fopen(fullfile(DATADIR,[DATAFILE_PRE{ifile} subject 'ascii' DATAFILE_SUF]),'rt');
oneline = fgetl(datafid);
while ischar(oneline)
oneline = fgetl(datafid);
if ~ischar(oneline) break; end
if trialnum >= trials_per_file
break;
end
if contains(oneline,'LogFrame Start') %first line of each trial
%get condition
while (~contains(oneline,'Target Condition:')) oneline = fgetl(datafid); end
splitline = split(':',oneline);
condition = strtok(splitline{2});
%get jitter
while (~contains(oneline,'FixMS:')) oneline = fgetl(datafid); end
splitline = split(':',oneline);
jitter = str2num(strtok(splitline{2}))/1000;
%fill in vectors
event_onset_list(ifile,trialnum*6+1) = seconds_from_start;
event_onset_list(ifile,trialnum*6+2) = seconds_from_start+2.5;
event_onset_list(ifile,trialnum*6+3) = seconds_from_start+2.5;
event_onset_list(ifile,trialnum*6+4) = seconds_from_start+2.5;
event_onset_list(ifile,trialnum*6+5) = seconds_from_start+2.5;
event_onset_list(ifile,trialnum*6+6) = seconds_from_start+2.5;
duration_onset_list(ifile,trialnum*6+1) = 2.5;
duration_onset_list(ifile,trialnum*6+2) = 2.5;
duration_onset_list(ifile,trialnum*6+3) = 2.5;
duration_onset_list(ifile,trialnum*6+4) = 2.5;
duration_onset_list(ifile,trialnum*6+5) = 2.5;
duration_onset_list(ifile,trialnum*6+6) = 2.5;
seconds_from_start = seconds_from_start + 10 + jitter;
switch (condition)
case 'Friend'
Stranger_mask(ifile,trialnum*6+1) = true;
Partner_mask(ifile,trialnum*6+1) = true;
case 'Partner'
Friend_mask(ifile,trialnum*6+1) = true;
Stranger_mask(ifile,trialnum*6+1) = true;
case 'Stranger'
Friend_mask(ifile,trialnum*6+1) = true;
Partner_mask(ifile,trialnum*6+1) = true;
otherwise
error('unknown condition');
end
trialnum = trialnum + 1;
end %
end % while get line loop
fclose(datafid);
end %for ifile
% now write the onset files, 1 per condition per run
for irun = 1:num_runs
%write onset in seconds, duration in seconds, weight=1 with tabs
%separating each
%Regressor1
outfilename = fullfile(EXP_DIR,'onset_files',sprintf('s%s',subject),sprintf('s%s_run%d_Friend.txt',subject,irun));
Mwrite = [ event_onset_list(irun,Friend_mask(irun,:))' duration_onset_list(irun,Friend_mask(irun,:))' weights_list(irun,Friend_mask(irun,:))'];
dlmwrite(outfilename,Mwrite,'\t');
%regressor2
outfilename = fullfile(EXP_DIR,'onset_files',sprintf('s%s',subject),sprintf('s%s_run%d_Stranger.txt',subject,irun));
Mwrite = [ event_onset_list(irun,Stranger_mask(irun,:))' duration_onset_list(irun,Stranger_mask(irun,:))' weights_list(irun,Stranger_mask(irun,:))'];
dlmwrite(outfilename,Mwrite,'\t');
%regressor3
outfilename = fullfile(EXP_DIR,'onset_files',sprintf('s%s',subject),sprintf('s%s_run%d_Partner.txt',subject,irun));
Mwrite = [ event_onset_list(irun,Partner_mask(irun,:))' duration_onset_list(irun,Partner_mask(irun,:))' weights_list(irun,Partner_mask(irun,:))'];
dlmwrite(outfilename,Mwrite,'\t');
end % for irun = 1:nruns
0 Comments
Answers (1)
Walter Roberson
on 5 Jan 2018
You forgot to test for end of file while doing that fgetl() loop.
5 Comments
Walter Roberson
on 7 Jan 2018
When I look at that, it appears to me you did not end the while for the ~contains properly. Your previous code had
while (~contains(oneline,'FixMS:')) oneline = fgetl(datafid); end
which would skip over all lines until it found one with FixMS: , and that was a problem only because you might encounter EOF.
Your replacement code is of the form
while (~contains(oneline,'FixMS:')) oneline = fgetl(datafid);
if ~ischar(oneline); break; end
... do a bunch of things
end
end
which does the stuff even if the replacement line was not FixMS:
See Also
Categories
Find more on Characters and Strings in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!