我在文本文件中有数据,该文件包含文本文件中每行的不同数量的列。我的数据采用以下格式:
2
21 2623
707 40 1
在连续三个数字后,数据保持相同的结构,直到文件结束。我想处理数据,所以我有三个向量X,Y和Z,它们包含有三个数字的行的值,所以:
X = 707
Y = 40
Z = 1
非常感谢!
答案 0 :(得分:2)
假设要忽略的行数不常量,并且您希望以编程方式而不是使用导入向导执行此操作,则首先需要确定要忽略的行数。
执行此操作的一种方法是使用fgetl
,它逐行浏览文件。获得标题后,您可以使用dlmread
或textscan
等函数读取数据。
例如:
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)
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);