Форум

им. Зелёного Батискафа

АвторСообщение



Зарегистрирован: 05.03.07
Откуда: Россия, Тюмень
ссылка на сообщение  Отправлено: 24.01.10 01:01. Заголовок: Тоже читалка *.las но на MatLab


 
%Сам понимаю, что алгоритм чтения заголовка не очень изящен, но уж как
%получилось... В общем функция читает поданный на вход *.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



Вопрос: Что это за белое вещество в птичьем дерьме?
Ответ: Это тоже птичье дерьмо.
Спасибо: 0 
Профиль Цитата Ответить
Ответов - 1 [только новые]





Зарегистрирован: 05.03.07
Откуда: Россия, Тюмень
ссылка на сообщение  Отправлено: 24.01.10 01:02. Заголовок: Надо сразу сказать, ..


Надо сразу сказать, что MatLab очень долго работает с текстовиками, не для того он был придуман...
Я уж не говорю про вышеприведённый код, главной ценностью которого является пример использования нескольких специфичных функций.

Вопрос: Что это за белое вещество в птичьем дерьме?
Ответ: Это тоже птичье дерьмо.
Спасибо: 0 
Профиль Цитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  5 час. Хитов сегодня: 2
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет



Создай свой форум на сервисе Borda.ru
Текстовая версия