在matlab中逐行读取文件

时间:2014-07-06 00:45:39

标签: matlab

我有一个MATLAB代码的输入文件,它列出了网格中相邻顶点的索引。对于与文件的行号具有相同等级的顶点,我列出了同一行上的相邻顶点索引 e.g。

45, 56, 22
44, 12
12, 23,56,76

我想读一读 作为单元格数组存入我的代码。如下。

NBR = { {45,56,22}, {44,12}, {12,23,56,76} }

有没有MATLAB功能来实现这一目标?

2 个答案:

答案 0 :(得分:2)

新答案:

我终于找到了一个不错的解决方案。实际上,importdata在这里可以提供帮助,谢谢@Divakar。

>> C = importdata('file','')
C = 
    '45, 56, 22'
    '44, 12'
    '12, 23,56,76'
>> C = cellfun(@str2num, C, 'UniformOutput', 0)
C = 
    [1x3 double]
    [1x2 double]
    [1x4 double]
>> C = cellfun(@(x) mat2cell(x, [1], ones(size(x,2),1)), C, 'UniformOutput', 0)'
C = 
    {1x3 cell}    {1x2 cell}    {1x4 cell}
>> NBR = { {45,56,22}, {44,12}, {12,23,56,76} };
>> isequal(NBR,C)
ans =
     1

旧答案:

不幸的是importdata似乎对此任务太有限了,我找不到用textscan读取整个文件然后应用一些cellfun的好方法。 csvread存在在应该有NaN值的地方插入0的问题,因此对于实际包含零的数据集不起作用。

所以老式的方式看起来像这样:

fid = fopen('file');
ind = 1;
line = fgetl(fid); % #get first line

while line ~= -1; % #read until end of file
    cont = cellfun(@str2num, strsplit(line, ','));
    cont = mat2cell(cont, [1], ones(size(cont,2),1));
    C{ind} = cont;
    line = fgetl(fid);
    ind = ind + 1;
end

fclose(fid);

演示,我的脚本保存为readin.m

>> readin
>> C
C = 
    {1x3 cell}    {1x2 cell}    {1x4 cell}
>> C{1}
ans = 
    [45]    [56]    [22]
>> C{2}
ans = 
    [44]    [12]
>> C{3}
ans = 
    [12]    [23]    [56]    [76]
>> NBR = {{45,56,22}, {44,12}, {12,23,56,76}};
>> isequal(NBR,C)
ans =
     1

答案 1 :(得分:1)

您可以使用fgets在matlab中逐行读取文件

fid = fopen('yourfile');

tline = fgets(fid);
while ischar(tline)
    disp(tline)
    tline = fgets(fid);
end

fclose(fid);