Вы не можете иметь массив, содержащий как числовые значения, так и строки.
Если вы хотите иметь как числовые значения, так и строки, вы должны использовать cellarray
.
Поскольку, как вы писали, вам не нравится иметь структуру с двумя полями, используя textscan
, кажется многообещающим способом, даже если это будет немного сложно.
Вы можете преодолеть проблему format
спецификации, указав:
format
в string
delimiter
в '
(в вас, например текст включен в двух '
)
Ваш входной файл будет храниться в ящике в виде набора строк.
Теперь вы можете извлечь как числовые значения, так и строки, сканируя элементы сотового массива.
Чтобы определить числовые значения, вы можете попытаться преобразовать строку в числовой массив с помощью функции str2num
:
- если строка содержит только nueric значения, вы можете хранить кумулятивно значения в массиве
- если conversin не удается, это означает, что это была строка, то вы можете хранить его кумулятивно в строке
вы также можете установить флаг и использовать его позволяет вставлять в выходной массив числового значения (например, NaN
), когда строка найдена; это может помочь вам понять, где строки были во входном файле.
Также для обоих условий вы можете оценить длину частичных массивов чисел или строки и сохранить их в другом массиве.
Это позволяет вам понять, где определенное число или строка находилась во входном файле.
В этом случае вы можете найти возможную реализацию описанного выше подхода.
% Open the input file
fp=fopen('mix_n_s.dat','r');
% Read the input file as a string in a cell array using "'" as a
% delimitator
% c=textscan(fp,'%s','delimiter','''');
c=textscan(fp,'%s','delimiter','''');
% Close the input file
fclose(fp);
% Extract the cell array
a=c{1};
% Initialize the output variables
% Array with the numeric values
numeric_array=[];
% String with the string in the input file
the_strings=[];
% Array with the number of numeric values and strings
the_cnt=[];
% Define the flag for enabling the isertion of NaN in the output numeric
% array in case a string is found
insert_nan=1;
% Scan the cellarray to extract the numbers and the strings
for i=1:length(a)
x=a{i}
% If the i-th element is empty (this occurs when there are at least two
% consecutive string in the input file, do nothing
if(~isempty(x))
% If the i-th element is not empty try to convert it into a numeric array
m=str2num(x);
% If the output is not empty you have read one or more than one
% numeric values
if(~isempty(m));
% Then store them into an array
numeric_array=[numeric_array m];
% The lengh of the array gives you the number of numeric values;
% store it the array
the_cnt=[the_cnt length(m)];
else
% If the conversin failed, you have read a string; store it in a
% string
the_strings=[the_strings ' ' x];
% Store the length of the string in the array; if you store it as
% a negative value, you can recognise it later on
the_cnt=[the_cnt -length(x)];
% if the flag is on, then insert NaN in the numeric array
if(insert_nan)
numeric_array=[numeric_array NaN];
end
end
end
end
numeric_array
the_strings
the_cnt
Основываясь на примере ввода предоставленных Вами (я немного изменил строку):
1 0 23 'x' 'x' 'x' 0 0 0 1 1 10.3 54 123.45678 'x' 'x' 'x'
выхода является следующим (флагом для inssert NaN
включен):
numeric_array =
Columns 1 through 7
1.0000 0 23.0000 NaN NaN NaN 0
Columns 8 through 14
0 0 1.0000 1.0000 10.3000 54.0000 123.4568
Columns 15 through 17
NaN NaN NaN
the_strings =
x abcd efghilm x x x
the_cnt =
3 -1 -4 -7 8 -1 -1 -1
Это можно интерпретировать следующим образом:
- глядя на
numeric_array
массива: в файле ввода
- три числовых значений, то три строки, затем восемь числовых значений и три строки
- глядя на
the_cnt
массив, вы можете понять длину (отбросить знак -
) каждой строки.
Надеюсь, это поможет.
Qapla '
Полный и всесторонний ответ. Благодарю. –
Добро пожаловать! С новым годом!!! –
С Новым годом;) –