通常我使用load
或csvread
加载数据。现在我需要使用以下结构加载数据:
0.1, 0.2, 0.3, 0.4, some_text
0.5, 0.6, 0.7, 0.8, some_text2
...
由于load
和csvread
只能读取数值,因此它们都无用。我发现我可以像这样使用readtable
:
readtable('file.txt', 'Delimiter', ',', 'Format', '%f%f%f%f%s');
现在我有两个问题:
1)readtable
假设我的文件有标题,我的数据线少了一些。
2)数据存储在Nx4表中而不是Nx4双矩阵
有任何帮助解决这两个问题吗?在我的案例中是否有任何更有用的功能?
编辑:最后我只需要加载文件中的数值(第1列:第4列)
答案 0 :(得分:0)
在您的代码中将readtable
替换为textscan
,而您几乎就在那里
使用您的示例 file.txt
0.1, 0.2, 0.3, 0.4, some_text
0.5, 0.6, 0.7, 0.8, some_text2
使用textscan阅读
fid = fopen('file.txt');
data = textscan(fid, '%f%f%f%f%s', 'Delimiter', ',');
fclose(fid);
然后你可以收集前4列的数据
dataValues = [data{1:4}]
dataValues =
0.1 0.2 0.3 0.4
0.5 0.6 0.7 0.8
答案 1 :(得分:-1)
这应该有效。假设您保存了./input.txt
:
1.1, 2.2, 3.3, 4.4, Hello world
6.6, 7.7, 8.8, 9.9, How are you
要阅读本文,请使用Matlab本机逐行解析函数textscan
;在这里,'%s' for(Mathwork documentation)。
它包裹在另一个细胞中。提取只有一个元素的单元格hold_cell
,我们有一个N
乘1个单元格x_in
。
其余的很简单,如果我们记得一个字符串只是一个字符数组。
fid = fopen('./input.txt');
hold_cell = textscan(fid, '%s', 'Delimiter', '\n');
x_in = hold_cell{1,1};
hold_size=size(x_in);
N=hold_size(1,1);
y_out =zeros(N,4);
for i=1:1:N
hold_idx =strfind( x_in{i}, ',' );% those positions of comma
y_out(i,1) =str2num( x_in{i,1}( 1 : hold_idx(1)-1 ) );% 1st number
y_out(i,2) =str2num( x_in{i,1}( hold_idx(1)+1 : hold_idx(2)-1 ) );%2nd number
y_out(i,3) =str2num( x_in{i,1}( hold_idx(2)+1 : hold_idx(3)-1 ) );%3rd number
y_out(i,4) =str2num( x_in{i,1}( hold_idx(3)+1 : hold_idx(4)-1 ) );%4th number
end
disp(y_out);
输出:
1.1000 2.2000 3.3000 4.4000
6.6000 7.7000 8.8000 9.9000