Matlab - 使用数字和文本列读取数据

时间:2016-12-09 09:33:15

标签: matlab csv

通常我使用loadcsvread加载数据。现在我需要使用以下结构加载数据:

0.1, 0.2, 0.3, 0.4, some_text
0.5, 0.6, 0.7, 0.8, some_text2
...

由于loadcsvread只能读取数值,因此它们都无用。我发现我可以像这样使用readtable

readtable('file.txt', 'Delimiter', ',', 'Format', '%f%f%f%f%s');

现在我有两个问题:

1)readtable假设我的文件有标题,我的数据线少了一些。

2)数据存储在Nx4表中而不是Nx4双矩阵

有任何帮助解决这两个问题吗?在我的案例中是否有任何更有用的功能?

编辑:最后我只需要加载文件中的数值(第1列:第4列)

2 个答案:

答案 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