%Сам понимаю, что алгоритм чтения заголовка не очень изящен, но уж как
%получилось... В общем функция читает поданный на вход *.las и выдаёт две переменные:
%namewell - имя скважины
%WellPStemp - массив, содержащий два столбца: dept и PS
%
%[namewell WellPStemp]= readLAS(filename)
function [indwell namewell WellPS] = readLAS(filename)
%UNTITLED3 Summary of this function goes here
% Detailed explanation goes here
t=fopen(filename,'rt'); %открыли файл для чтения
%%%%%%%%%%%%%%Кусок чтения заголовка файла%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while t~=0 %Условие дурацкое, но мне надо делать проверку после чтения переменной, так что приходится изворачиваться
str=fgetl(t); %А цикл, собственно, пробегает по шапке *.las и читает номер скважины, код отсутствия значения, положение столбцов глубины и PS/SP
if ~isempty(str) %Проверка чтоб не пусто было...
if strcmp(str(1,1:2),'~A'),break,end %Здесь уже истинное условие окончания цикла, по достижению строки, начинающейся с ~A
if strcmp(str(1,1:10),'#MNEM.UNIT') %Если, вдруг так, невзначай, встретится заголовок, то...
i=0; %Обнулим мою любимую i
while str(1,11+i)==char(32) %Пропустим пробелы
i=i+1;
end
if str(11+i)=='D' %Если первый встретившийся символ "D", то предполагаем, что это "Data Type Information", и ищем значения null и well
null='0';
well=' ';
str=fgetl(t);
while or(well==' ',null=='0')
str=fgetl(t);
if or(strcmp(str(1,1),'#'),or(strcmp(str(1,1:2),'~A'),str(1,1:10)=='#MNEM.UNIT')),break,end %Что-то я решил перестраховаться, так, на всякий случай...
temp=strtrim(str(1,1:10));
kui=0; %Кусок чтения значения Null
if strcmp(temp(1:4),'NULL')
while str(1,10+kui)==char(32)
kui=kui+1;
end
null=str(10+kui);
while str(1,10+kui+1)~=char(58)
kui=kui+1;
null=[null str(10+kui)];
end
null=str2double(null);
end
kui=0; %Кусок чтения имени скважины
if strcmp(temp(1:4),'WELL')
while str(1,10+kui)==char(32) %Пропуск пробелов
kui=kui+1;
end
well=str(10+kui); %Чтение текста до двоеточия
while str(1,10+kui+1)~=char(58)
kui=kui+1;
well=[well str(10+kui)];
end
welltmp=strtrim(well); %Итоговая запись, до двоеточия. В версии 2.0 именно здесь имя скважины.
well=' '; %Чтение текста после двоеточия, типа имя скважины в версии 1.2
kui=kui+1;
while (10+kui<length(str))
kui=kui+1;
well=[well str(10+kui)];
end
if strcmp(welltmp,'WELL') %Выбор, что ж в итоге писать как имя скважины, ну явно не well...
well=strtrim((well));
else
well=welltmp;
end
end
end
end
if str(11+i)=='A' %Если первый встретившийся символ "A", то предполагаем, что это "Api Code", и ищем номера столбцов Dept и PS/SP
dept=0;
PS=0;
str=fgetl(t);
kui=0;
while not(strcmp(str(1,1),'~'))
str=fgetl(t);
kui=kui+1;
if strcmp(str(1,1:2),'~A'),break,end %Что-то я решил перестраховаться, так, на всякий случай...
temp=strtrim(str(1,1:10));
if strcmp(temp(1:4),'DEPT')
dept=kui;
end %Кусок чтения номера столбца Dept
if or(strcmp(temp(1:2),'PS'),strcmp(temp(1:2),'SP'))
PS=kui;
end; %Кусок чтения номера зонда спонтанной поляризации
end
if strcmp(str(1,1:2),'~A'),break,end
end
end
end
end
%%%%%%%%%%%%%%Кусок чтения заголовка файла%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%WellPStemp=ones(50000,2)*(-666); %Инициализация массива, типа чтобы не перераспределять память на каждом шаге цикла...
global WellPStemp %%%%%%%%%%%%%%%%%%%
kui=kui-1;
ind=1;
if PS~=0
while feof(t)==0
str=fscanf(t, '%g', [1 kui]);
if ~isempty(str)
WellPStemp(ind,:)=[str(dept) str(PS)];
if WellPStemp(ind,2)==null; WellPStemp(ind,:)=-666; end
if WellPStemp(ind,:)~=-666, ind=ind+1;end
end
end
WellPS=WellPStemp(1:ind-1,:);
else
WellPStemp=[-999 -999];
end
fclose(t);
namewell=well;
indwell=sscanf(well, '%g');
if isempty(indwell), indwell=sscanf(namewell, '%*s %g %*s'); end
end