Error using contains - First argument must be a string array...
조회 수: 19 (최근 30일)
이전 댓글 표시
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
답변 (1개)
Walter Roberson
2018년 1월 5일
You forgot to test for end of file while doing that fgetl() loop.
댓글 수: 5
Walter Roberson
2018년 1월 7일
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:
참고 항목
카테고리
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!