从matlab中的文本文件中读取

时间:2013-06-13 20:17:00

标签: matlab

我在“file.txt”中有以下格式的数据:

b0,  2,1
b1,  3,4
b2,  5,6
b3,  7,8
b4,  9,10
L0, 11, 12
L1, 13, -154
L2, 16, 18
L3,-19,-20
L4,-21,-22
L5,-23,24
L6, 25,28
L7, 27,30
L8, 31,35
L9,-38,40
b0,  0.1,89

该数据继续以相同的顺序(即b1,b2,b3 ......)继续直到大数。我想以矩阵格式读取b0 ... b4的两个数字(即每行中用逗号分隔的数字)中的每一个,这样我就可以用它们做进一步的计算。基本上每个b0在“file.txt”中每15行出现,依次为b1,b2,b3,b4。我尝试使用一些带有“textscan”的示例代码,但不幸的是我收到了错误。任何帮助将非常感激。谢谢!

4 个答案:

答案 0 :(得分:0)

打开文件,并使用适当的转换说明符读取每列。

fileID = fopen('scan1.txt');
C = textscan(fileID, '%s %s %f32 %d8 %u %f %f %s %f');
fclose(fileID);
celldisp(C)

看到它:

Documentation Center

答案 1 :(得分:0)

这是我的方法。在MATLAB中使用for循环很糟糕,但是每当我处理单元格时,我都会发现它被使用了。这可能是一种更好的方法,但这似乎适用于你给我的数据。

f = fopen('data.txt');
a = textscan(f, '%s', 'Delimiter', ',');
names  = [];
vals_a = [];
vals_b = [];
for i = 1:3:numel(a{1})
    names  = [names;  a{1}{i+0}];
    vals_a = [vals_a; str2num(a{1}{i+1})];
    vals_b = [vals_b; str2num(a{1}{i+2})];
end
fclose(f);

答案 2 :(得分:0)

由于您使用逗号分隔值,因此需要更改textscan使用的分隔符。要将这两个数字组合成一个数组,您可以使用CollectOutput选项:

fid = fopen('sample.txt');
C = textscan(fid, '%s %f %f', 'Delimiter', ',', 'CollectOutput', true);
fclose(fid);

提取所有b0字段:

values = C{2}(strcmp(C{1}, 'b0'), :);

并提取以b0, ..., b4

开头的所有行的值
values = C{2}(ismember(C{1}, {'b0', 'b1', 'b2', 'b3', 'b4'}), :);

答案 3 :(得分:0)

textscan一样,您可以使用importdata(但textscan可能会更快):

content = importdata('Samp.txt');

然后content.rowheaders将包含标签(当然会重复)。 content.data封装了所有数字:

Data = content.data;

然后使用mat2cellreshape你可以做到这一点:

Grouped = mat2cell(Data, ones(size(Data,1),1));

这样,您将组合单元格中每个标签的数据。然后使用:

Mat = reshape(Grouped, [15 size(Data,1)/15]);

Mat将是一个以排序方式包含整个数据的单元格数组。 Mat{1,:}所有匹配项的b0数据(或使用Mat(1,:)获取所有b0数据的单元格数组。)

希望它有所帮助。