Форум » Программистские штучки » Тоже читалка *.las но на MatLab » Ответить

Тоже читалка *.las но на MatLab

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

Ответов - 1

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



полная версия страницы