Matlab - почему переменная fileID не обновляется при импорте данных с использованием цикла for?

Я использую генератор кода импорта данных Matlab для передачи данных серии команд. Это отлично работает, когда я запускаю сценарий и ссылаюсь на один файл, но если я перебираю несколько файлов, мои переменные не обновляются, как я ожидал. Я полагаю, что проследил проблему до того, что «fileID» не обновляется после первой итерации цикла.

В приведенном ниже коде я могу подтвердить, что «имя файла» обновляется при каждой итерации цикла, а «идентификатор файла» — нет. Следовательно, на каждой итерации переменной y присваивается один и тот же вектор.

Может ли кто-нибудь предложить, где я ошибаюсь?

FileList = dir('*.csv');
N = size(FileList,1);
for k = 1:N

 % get the file name:
filename = FileList(k).name;
delimiter = ',';
startRow = 2;

%% Format string for each line of text:
%   column2: double (%f)
%   column3: double (%f)
%   column4: double (%f)
%   column5: double (%f)
% For more information, see the TEXTSCAN documentation.
formatSpec = '%*s%f%f%f%f%[^\n\r]';

%% Open the text file.
fileID = fopen(filename,'r');

%% Read columns of data according to format string.
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'HeaderLines' ,startRow-1, 'ReturnOnError', false);

%% Close the text file.
fclose(fileID);

%% Allocate imported array to column variable names
O1 = dataArray{:, 1};
H1 = dataArray{:, 2};
L1 = dataArray{:, 3};
C1 = dataArray{:, 4};

%% Test filename and fileID
filename
fileID

%% Clear temporary variables
clearvars filename delimiter startRow formatSpec fileID dataArray ans;
y=C1;
figure 
plot(y);

end

person ManChild    schedule 09.04.2015    source источник
comment
Фактический дескриптор fileID (обычно целое число) освобождается при выполнении fclose(fileID). Таким образом, в следующий раз, когда вы откроете файл, fileID, использованный ранее, будет доступен и будет повторно использоваться снова для открытия нового файла, поэтому он всегда будет отображаться одинаково в вашем текущем коде. Это не означает, что был обработан один и тот же файл.   -  person Hoki    schedule 10.04.2015
comment
@Hoki - Ты должен сделать это ответом. Именно поэтому это происходит.   -  person rayryeng    schedule 10.04.2015


Ответы (1)


FileID не должен меняться так, как вы ожидаете. fileID — это только идентификатор файла, извлеченные данные находятся в dataArray, когда вы сканируете текст с помощью fileID.

Таким образом, FileID обычно будет равен 3, если вы просто открыли файл и закрыли его перед открытием нового. Если вы не закроете его, в fileID для каждого файла будет свой номер.

person Nerea González Vázquez    schedule 10.04.2015
comment
Для дальнейшего объяснения 3, 1 — это зарезервированный идентификатор для стандартных выходных данных на консоль, 2 для выходных данных об ошибках. Первый файл, который вы открываете, получает идентификатор 3, второй — идентификатор 4. - person Daniel; 10.04.2015
comment
Если у вас есть какие-либо сомнения, открыт ли правильный файл, используйте fopen(fileID), он сообщает вам, какой файл принадлежит идентификатору. - person Daniel; 10.04.2015
comment
Спасибо за ответы, очень понятно, теперь я понимаю, как используется fileID. - person ManChild; 13.04.2015