Error using contains - First argument must be a string array...
19 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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 commentaires
Réponses (1)
Walter Roberson
le 5 Jan 2018
You forgot to test for end of file while doing that fgetl() loop.
5 commentaires
Walter Roberson
le 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:
Voir également
Catégories
En savoir plus sur Characters and Strings dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!