我想读取水的平均饱和度(%)数据,如下所示。此数据是大文件的部分形式,但平均水饱和度(%)REPEATS本身仅以给定格式显示。
Average Pressure
Total Pore Volume psia 3884.9
HC. Pore Volume psia 3884.9
Average P/Z
Total Pore Volume psia 4457.8
HC. Pore Volume psia 4457.8
Average Saturation %
Oil 84.911
Gas .08873
Water 15.000
Percentage Recovery
Stock Tank Oil .02211
STO as a % of Mobile Oil .02891
Total Gas .02034
Water 62e-12
我试图通过使用readline.m函数来做到这一点,但不幸的是,平均含水饱和度(%)数据的位置不是由行号固定的。对于不同型号的类似输出文件,行号会发生变化。
这就是我想要做的事情:
%# Reading Water Saturation (Sw) data from output (.OUT) file of reservoir model
Sw_LineNo=[554,968,1120,1272,1424,1576,1728,1880,2032,2184,2336,2488,2640,2792,2944,3096,3248,3400,3552,3704,3856]; % This column vector contains the line numbers of the .out file with Sw values for year 1 till 20
for i=1:size(Sw_LineNo,2)
read_value=readline('ReservoirModel_ExplorWell_CMGBuilder.out',Sw_LineNo(i)); % read_value stores values in form of string
Swav_Data_E_W(i,j)=str2num(read_value(33:38)); % converts the required portion of string (Sw value) to number
end
现在,如果我的模型(ReservoirModel_ExplorWell_CMGBuilder.out
)发生变化,那么水的平均饱和度(%)位于文本文件中的行号也会发生变化。因此,Sw_LineNo
会因不同模型而发生变化,而且我拥有大量模型。
请建议正确的方法来读取水资料的所有平均饱和度(%)。
答案 0 :(得分:0)
%# Reading Average Water Saturation (Savw) data from output (.OUT) file of reservoir model
fid = fopen('ReservoirModel_CMGBuilder.out'); % open the file
dotOUT_fileContents = textscan(fid,'%s','Delimiter','\n'); % read it into one big array, row by row
dotOUT_fileContents = dotOUT_fileContents{1};
fclose(fid); %# don't forget to close the file again
%# find rows containing 'Average Saturation %'
Swav_Starts = strmatch('Average Saturation %',dotOUT_fileContents); % Swav_Starts contains the line numbers wherever 'Average Saturation %' is found
nSwav = length(Swav_Starts); % total no. of Swav values will be equal to the total no. of 'Average Saturation %' read from the .out file
%# loop through the file and read the numeric data
for w = 1:nSwav
%# read lines containing numbers
tmp_str = dotOUT_fileContents(Swav_Starts(w)+3); % stores the content of the 3rd row from the row containing 'Average Saturation %' in form of string
tmp_str = tmp_str{:}; % store the content of the string which contains Swav, as well, in form of a character
%# assign output
Swav_yearly(w,j) = str2num(tmp_str(30:35)); % convert the part of the character containing Swav into number
end
现在tmp_str = dotOUT_fileContents(Swav_Starts(w)+3);
生成以下字符串:
Water 15.000
如果我尝试使用str2num将其转换为数字,那么我得到一个空矩阵。所以我选择包含饱和度值(此处为15.000
)的字符串中的字符,然后将此字符更改为数字,如下所示,给出平均水饱和度的值:
str2num(tmp_str(30:35))
如果有人有任何方法从字符串中提取数字而不选择我所做的字符,请提供建议。