Как читать данные кусками из файла блокнота в Matlab? - PullRequest
2 голосов
/ 25 августа 2010

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

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 соответственно и аналогично для других.

1 Ответ

5 голосов
/ 25 августа 2010

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

Возможно, есть более элегантные способы чтения;вот что-то быстрое:

%# 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
...