此文件是一个输出文件,其第一行是标题,后跟带有数据的n
行。第一组数据之后是具有不同值的更相似的数据集。
我想从这个文件中读取所有数据集的第2和第3列,即direction 1
,direction 2
等。目前我在函数中使用以下代码行来读取数据如下图所示:
fid = fopen(output_file); % open the output file
dotOUT_fileContents = textscan(fid,'%s','Delimiter','\n'); % read it as string ('%s') into one big array, row by row
dotOUT_fileContents = dotOUT_fileContents{1};
fclose(fid); %# close the file
%# find rows containing 'SV'
data_starts = strmatch('SV',...
dotOUT_fileContents); % data_starts contains the line numbers wherever 'str2match' is found
nDataRows=data_starts(2)-data_starts(1)-1;
ndata = length(data_starts); % total no. of data values will be equal to the corresponding no. of 'str2match' read from the .out file
%# loop through the file and read the numeric data
for w = 1:ndata
%# read lines containing numbers
tmp_str = dotOUT_fileContents(data_starts(w)+1:data_starts(w)+nDataRows);
%# convert strings to numbers
y = cell2mat(cellfun(@(z) sscanf(z,'%f'),tmp_str,'UniformOutput',false)); % store the content of the string which contains data in form of a character
data_matrix_column_wise(:,w) = y; % convert the part of the character containing data into number
%# assign output in terms of lag and variogram values
lag_column_wise(:,w)=data_matrix_column_wise(2:6:nLag*6-4,w);
vgs_column_wise(:,w)=data_matrix_column_wise(3:6:nLag*6-3,w);
end
如果我没有上面输出文件中显示的星号,那么此功能运行良好。但是,如上所示的输出文件之一包含星号,并且上述代码在这种情况下失败。如何处理数据中的 stars ,以便能够正确读取第2列和第3列?
答案 0 :(得分:3)
问题在于您的代码的这一部分:
sscanf(z,'%f')
你强迫匹配浮点数,当它遇到星星时就失败了。你最好用
之类的东西替换它textscan(z, '%f %f %f %s %f %f', 'Delimiter', '\t')
并删除cell2mat并相应地修改以下行以测试是否存在字符串。
或者,这取决于那些星星的意思,你可以用零或有意义的东西取代星星,你当前的代码可以正常工作。
答案 1 :(得分:1)
将所有列作为字符串读取:
C = textscan(fid, '%s%s%s%s%s%s');
这为您提供了一个C,它是一个包含6列的单元格数组。您可以访问C的元素: 列n和行m的C {1,n} {m}。 然后在for循环中,您可以从48中减去值,并获得这样的数字
for n=1:6
for m=1:M
A(m,n) = C{1,n}{m}-48;
end
end
您需要的内容将存储在矩阵A中。当然,您可以将C {1,n} {m}与这8颗星进行比较,并决定使用它做什么。