从.txt文件中读取值到Matlab中的向量

时间:2015-06-04 10:58:14

标签: matlab file file-io io

我在文本文件中有数据,该文件包含文本文件中每行的不同数量的列。我的数据采用以下格式:

  

2

     

21 2623

     

707 40 1

在连续三个数字后,数据保持相同的结构,直到文件结束。我想处理数据,所以我有三个向量X,Y和Z,它们包含有三个数字的行的值,所以:

  

X = 707

     

Y = 40

     

Z = 1

非常感谢!

3 个答案:

答案 0 :(得分:2)

假设要忽略的行数常量,并且您希望以编程方式而不是使用导入向导执行此操作,则首先需要确定要忽略的行数。

执行此操作的一种方法是使用fgetl,它逐行浏览文件。获得标题后,您可以使用dlmreadtextscan等函数读取数据。

例如:

fID = fopen(myfilepath, 'r'); % Open data file for reading

ncoldesired = 3;

ii = 0;
% Search for the first row of "good" data
while ~feof(fID) % Loop will stop if it reaches the end of the file
    tline = fgetl(fID);
    temparray = str2num(tline); % Convert string to array of doubles, could also use regex

    if length(temparray) == ncoldesired
        % Found the first row of data
       nheaders = ii;
       fclose(fID);
       break
    end

    ii = ii + 1;
end

% Error Catching
if exist('nheaders', 'var') == 0 && feof(fID) 
    fclose(fID);
    error('End of file reached, no good data found');
end

mydata = dlmread(myfilepath, ' ', nheaders, 0); % For some reason dlmread uses zero-based indexing unlike everything else in MATLAB

答案 1 :(得分:0)

如果您不需要存储前三行,则可以使用textscan 指定属性'headerlines' 3或dlmrear,指定属性'roffset' 4。

希望这有帮助。

答案 2 :(得分:0)

您可以使用cellfuncell2mat的组合。

 rowContainsThreeElems = cellfun(@(x) size(x,2)==3, tline_c);

% // Get those rows 
A= cell2mat(tline_c(rowContainsThreeElems==1))
A =
   707    40     1
% //    Data.txt
% //    --------------
% //    2
% //    21 2623
% //    707 40 1

% // Read in the file and convert it to an array
fid = fopen('data.txt','r');
tline = fgets(fid);
tline_c = {};
n = 1;
while ischar(tline)
    disp(tline)
     % // Convert the line to a numeric array but store it in a cell array
    tline_c{n} = str2num(tline);
    tline = fgets(fid);    
    n=n+1;       
end
fclose(fid);

% // Get the lines that have three elements
rowContainsThreeElems = cellfun(@(x) size(x,2)==3, tline_c);

rowContainsThreeElems =

   0   0   1

% // Get those rows 
A= cell2mat(tline_c(rowContainsThreeElems==1));
ans =

   707    40     1

% // Add them to X,Y,Z  
X=A(:,1); Y=A(:,2); Z=A(:,3);