#author("2024-10-24T14:52:59+09:00","default:Miyashita","Miyashita") #author("2024-10-24T14:54:08+09:00","default:Miyashita","Miyashita") * Web ページ中の表の読み取り [#ld6986d7] MATLAB で html を拾ってくる関数は [[webread>https://jp.mathworks.com/help/matlab/ref/webread.html]] や [[urlread>https://jp.mathworks.com/help/matlab/ref/urlread.html]] などがある.~ そこから表を拾ってきてうまい具合にパースしてくれるものがほしかった. ** urlreadtable [#q95a2385] MATLAB の中の人が開発した [[urlreadtable>https://jp.mathworks.com/matlabcentral/fileexchange/59548-url-read-table]] が便利. #codeprettify(lang-matlab){{ T = urlreadtable(url) }} とするだけで,うまいことやってくれる.~ 表がページに複数含まれる場合は,セル配列で個々のセルに table 型の変数が入る. **例 [#zfcc38ec] ** urlreadtable の使用例 [#zfcc38ec] 気象庁の潮位推算地点の一覧表をなんとか MATLAB で使える table 型にしたかった. #codeprettify(lang-matlab){{ clear close all %% reference url url = 'https://www.data.jma.go.jp/kaiyou/db/tide/suisan/station2024.php'; %% read T = urlreadtable(url); T = T{1}; T(:,9:end) = []; T(1:2,:) = []; %% rename vars ncol = size(T,2); for j = 1:ncol T = renamevars(T,T.Properties.VariableNames{j},strrep(T.Properties.VariableNames{j},sprintf('web%d',j),'')); end %% TP補正できない地点を除く ind = table2array(rowfun(@(x) isempty(x{1}),T(:,"潮位表基準面の標高(cm)"))); T(ind,:) = []; ind = table2array(rowfun(@(x) strcmp(x,'-'),T(:,"潮位表基準面の標高(cm)"))); T(ind,:) = []; clear ind %% セル{文字列} から数値に変換 Ttmp = rowfun(@(x) str2double(x{1}),T(:,"潮位表基準面の標高(cm)")); T{:,"潮位表基準面の標高(cm)"} = table2cell(Ttmp); Ttmp = rowfun(@(x) str2double(x{1}),T(:,"MSLの標高(cm)")); T{:,"MSLの標高(cm)"} = table2cell(Ttmp); Ttmp = rowfun(@(x) str2double(x{1}),T(:,"MSL潮位表基準面(cm)")); T{:,"MSL潮位表基準面(cm)"} = table2cell(Ttmp); %% 緯度経度を10進法に nrow = size(T,1); lon_all = zeros(nrow,1); lat_all = zeros(nrow,1); for i = 1:nrow londm = str2double(strrep(split(string(table2cell(T(i,"経度(東経)"))),"゜"),"'","")); lon_all(i) = londm(1) + londm(2)/60; latdm = str2double(strrep(split(string(table2cell(T(i,"緯度(北緯)"))),"゜"),"'","")); lat_all(i) = latdm(1) + latdm(2)/60; end T{:,"経度(東経)"} = table2cell(array2table(lon_all)); T{:,"緯度(北緯)"} = table2cell(array2table(lat_all)); }} 上記を実行すると下の図のようなテーブルが作成される.ちなみにこの一覧表の緯度経度情報は度分までしかなく,秒がわからないので位置はあまりあてにならない(結構困る).~ #ref(https://main-t-miyashita.ssl-lolipop.jp/hydrocoast/image/MATLAB/table_JMAstations.png,951x795)