Как читать данные из многократного формата большого текстового файла в MATLAB? - PullRequest
0 голосов
/ 28 августа 2010

Я хочу прочитать данные о средней насыщенности (%) для воды, как показано ниже. Эти данные являются частичной формой большого файла, однако средняя водонасыщенность (%) повторяется только в данном формате.

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 меняется для разных моделей, и у меня большое количество моделей.

Пожалуйста, предложите правильный способ считывания всей средней насыщенности (%) для данных по воде.

1 Ответ

0 голосов
/ 28 августа 2010
%# 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))

Пожалуйста, посоветуйте, если кто-тоесть какой-либо метод для извлечения числа из строки без выбора символов, как я сделал.

...