Как читать данные кусками из файла блокнота в Matlab?

Мои данные в следующем формате:

TABLE NUMBER 1
                                                FILE: name_1
                                                            name_2
TIME    name_3
day name_4
-0.01   0
364.99  35368.4
729.99  29307
1094.99 27309.5
1460.99 26058.8
1825.99 25100.4
2190.99 24364
2555.99 23757.1
2921.99 23240.8
3286.99 22785
3651.99 22376.8
4016.99 22006.1
4382.99 21664.7
4747.99 21348.3
5112.99 21052.5
5477.99 20774.1
5843.99 20509.9
6208.99 20259.7
6573.99 20021.3
6938.99 19793.5
7304.99 19576.6
TABLE NUMBER 2
                                                FILE: name_1
                                                            name_5
TIME    name_6
day name_7
-0.01   0
364.99  43110.4
729.99  37974.1
1094.99 36175.9
1460.99 34957.9
1825.99 34036.3
2190.99 33293.3
2555.99 32665.8
2921.99 32118.7
3286.99 31626.4
3651.99 31175.1
4016.99 30758
4382.99 30368.5
4747.99 30005.1
5112.99 29663
5477.99 29340
5843.99 29035.2
6208.99 28752.4
6573.99 28489.7
6938.99 28244.2
7304.99 28012.9
TABLE NUMBER 3

До сих пор я разбивал эти данные и читал переменные (time and name_i) из каждого файла следующим образом:

[TIME(:,j), name_i(:,j)]=textread('filename','%f\t%f','headerlines',5);

Но теперь я создаю данные этих файлов в 1 файл, как показано в начале. Например, я хочу прочитать и сохранить данные TIME в векторах TIME1, TIME2, TIME3, TIME4, TIME5 для name_3, name_6, _9 соответственно и аналогично для других.


person Community    schedule 24.08.2010    source источник


Ответы (1)


arrow_upward
5
arrow_downward

Прежде всего, я предлагаю вам не использовать имена переменных, такие как TIME1, TIME2 и т. д., так как это быстро приводит к путанице. Вместо этого вы можете, например. используйте массив ячеек с пятью строками (по одной для каждой лунки) и одним или двумя столбцами. В приведенном ниже примере кода wellData{2,1} — время для второй скважины, wellData{2,2} — соответствующий дебит нефти SC — Yearly.

Могут быть более элегантные способы чтения; вот что-то быстро:

%# open the file
fid = fopen('Reportq.rwo');

%# read it into one big array, row by row
fileContents = textscan(fid,'%s','Delimiter','\n');
fileContents = fileContents{1};
fclose(fid); %# don't forget to close the file again

%# find rows containing TABLE NUMBER
wellStarts = strmatch('TABLE NUMBER',fileContents);
nWells = length(wellStarts);

%# loop through the wells and read the numeric data
wellData = cell(nWells,2);
wellStarts = [wellStarts;length(fileContents)];

for w = 1:nWells
    %# read lines containing numbers
    tmp = fileContents(wellStarts(w)+5:wellStarts(w+1)-1);
    %# convert strings to numbers
    tmp = cellfun(@str2num,tmp,'uniformOutput',false);
    %# catenate array
    tmp = cat(1,tmp{:});
    %# assign output
    wellData(w,:) = mat2cell(tmp,size(tmp,1),[1,1]);
end
person Jonas    schedule 25.08.2010