将复杂的.txt文件读入Matlab

时间:2011-06-03 21:00:32

标签: string matlab file-io textscan

我想将.txt文件读入Matlab。 其中一列包含字母和数字。 (所以我猜一种方法是将此列读为字符串。)

问题是我还需要找出该列中大于5的数字。

e.g。 .txt看起来像

12 1
21 2
32 7
11 a
03 b
22 4
13 5
31 6

即。最终,我想得到

32 7
31 6

我怎么能得到它?任何专家,请帮忙!

2 个答案:

答案 0 :(得分:4)

您可以使用TEXTSCAN将文件内容读入字符串的单元格数组中,使用CELLFUNSTR2NUM将字符串转换为数字值('a'等字符并且'b'将导致空矩阵[]),删除其中包含任何空单元格的单元格数组,然后使用{{3将剩余数据转换为N×2矩阵}}:

fid = fopen('junk.txt','r');                        %# Open the file
data = textscan(fid,'%s %s','CollectOutput',true);  %# Read the data as strings
fclose(fid);                                        %# Close the file
data = cellfun(@str2num,data{1},'UniformOutput',false);  %# Convert to numbers
data(any(cellfun('isempty',data),2),:) = [];        %# Remove empty cells
data = cell2mat(data);                              %# Convert to N-by-2 array

矩阵data现在看起来像这样,给出问题中的示例文件:

>> data

data =

    12     1
    21     2
    32     7
    22     4
    13     5
    31     6

您可以在第二列中获取值大于5的行,如下所示:

>> data(data(:,2) > 5,:)

ans =

    32     7
    31     6

答案 1 :(得分:0)

fid = fopen('txt.txt','r');  

Aout = []; 

while(1)    
    [a1,count1] = fscanf(fid,'%s',1);
    [a2,count2] = fscanf(fid,'%s',1);
    if(count1 < 1 | count2 < 1)
        break;    
    end
    if(~isempty(str2num(a2)) & str2num(a2) > 5 & (~isempty(str2num(a1))) )
        Aout = [ Aout ; str2num(a1) str2num(a2) ];   
    end
end

fclose(fid);

违反了在循环期间生成Matlab变量的潜规则,但无论如何都是文本处理,所以你可能不会注意到它的缓慢。

编辑:在以前的版本中有太多错误,必须重新开始。