Error using contains - First argument must be a string array...

19 views (last 30 days)
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

Answers (1)

Walter Roberson
Walter Roberson on 5 Jan 2018
You forgot to test for end of file while doing that fgetl() loop.
  5 Comments
Sid Hatfield
Sid Hatfield on 7 Jan 2018
Thanks again!
This moved me past me issue I was having, but of course, I now have another. The script is written in a way such that is one of the three conditions I have identified are not found (Friend, Stranger, or Partner) it returns an "unknown condition" error, which is what is happening, although I know for certain the input file has these exact terms.
I have attached my input file as requested. Here is my current script with the above changes applied. It is entirely possible that I haven't applied the change recommended above properly.
function [] = read_logfiles(subject)
% 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 * 6);
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
got_eof = false;
while (~contains(oneline, 'TargetCondition:'))
oneline = fgetl(datafid);
if ~ischar(oneline)
got_eof = true;
break;
end
splitline = split(':',oneline);
condition = strtok(splitline{2});
%get jitter
got_eof = false;
while (~contains(oneline, 'FixMS:'))
oneline = fgetl(datafid);
if ~ischar(oneline)
got_eof = true;
break;
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 %
fclose(datafid);
end
end
end
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
Walter Roberson
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:

Sign in to comment.

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!