我有一些包含大约3000个条目的文件,包括与此类似的文本和数字数据:
file_path = '/home/my/file/path';
list_of_files = dir(file_path);
for i = 3:end_
new_data = importdata(fullfile(file_path,list_of_files(i).name));
end
我想在MatLab中的单独的1x3000向量中导入每个文件数据,但是当我使用'importdata'函数时,它会创建一个带有两个字段(data和textdata)的1x1结构。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
此外我尝试使用'textscan'功能,但它需要格式规范,但文件格式未知(每个文件的长度是不变的,但不清楚我们在哪里'x'或数字)
有人有建议怎么办?
答案 0 :(得分:1)
您不能拥有包含数值和字符串的数组。
如果您想同时拥有数值和字符串,则必须使用cellarray
。
因为,正如你所写的,你不喜欢有两个字段的结构,使用textscan
似乎是一种很有前途的方法,即使它有点复杂。
您可以通过指定:
来克服format
规范的问题
format
为string
delimiter
为'
(在您的示例中,文字包含在两个'
内)您的输入文件将作为字符串的sset存储在cellarray中。
现在,您可以通过扫描cellarray的元素来提取数值和字符串。
要识别数值,您可以尝试使用函数str2num
转换数字数组中的字符串:
您还可以设置一个标志并使用它来允许在找到字符串时在数字输出数组中插入一个值(例如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'