今回は、グラフに描画するデータを整理する作業について説明する。
インターネット経由でさまざまなデータを取得できるようになったことで、Webで公開されているデータを利用する機会が増えている。PowerShellは、そうした厳密には構造化されているとは言えないデータから、目的の数値データを取り出す処理にも使うことができる。
→連載「PowerShell Core入門 - 基本コマンドの使い方」の過去回はこちらを参照。
データの準備
Webで公開されているデータにはさまざまなものがあるが、ここでは気象庁が「気象庁|最新の気象データ」で公開している気温データを取得してグラフに描画するケースを考える。このWebページは、執筆時点では次のようなレイアウトでデータが配置されている。
このデータの中から、東京都のデータを取り出すことを考える。東京都のデータは、次のように掲載されている。
Microsoft Edgeの開発者ツールで該当部分を見てみると、table要素の中に記載されていることがわかる。
該当ページのHTMLをダウンロードし、Visual Studio Codeで確認すると次のようになっている。
Visual Studio Codeで閲覧するとフォーマットが自動的に整えられてしまうので、メモ帳でも確認しておく。
要するに、この文字列から地名と気温を抽出するPowerShellスクリプトを書けばよいということになる。
なお、このページのデータはCSVデータとしても提供されているので、通常ならそちらのデータを使う方がロジカルな選択だ。しかし今回は、フォーマットが曖昧な状態のテキストから、目的とする数値を取り出す例を示したいので、あえてWebページからデータを取得している。
Webページを取得するPowerShellスクリプト
まず、対象のWebページを取得して表示するPowerShellスクリプトを作成する。Webページの取得には、Windowsにデフォルトでインストールされているcurlコマンドを使う。curlは強力なコマンドで、LinuxやMacでもよく使われている。
#!/usr/bin/env pwsh
#========================================================================
# 気温データを取得して整理する
#========================================================================
$URL = 'https://www.data.jma.go.jp/obd/stats/data/mdrr/tem_rct/alltable/mxtemsad00.html'
$SrcFile = New-TemporaryFile
curl --get $URL > $SrcFile 2> $null
#========================================================================
# 取得したデータの中身を確認
#========================================================================
Get-Content $SrcFile
#========================================================================
# 作業用の一時ファイルを削除
#========================================================================
Remove-Item $SrcFile
実行すると次のようになる。
PS C:\Users\daichi> .\test-1.ps1
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>気象庁|最新の気象データ</title>
<meta name="Author" content="気象庁 Japan Meteorological Agency" />
<meta name="keywords" content="気象庁 Japan Meteorological Agency" />
<meta name="description" content="各地の日最高気温、日最低気温を表示します" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<link rel="stylesheet" type="text/css" href="/com/css/define.css" media="all" />
<link rel="stylesheet" type="text/css" href="../../../css/default.css" media="all" />
<link rel="stylesheet" type="text/css" href="../../../css/print.css" media="print" />
<script type="text/javascript" src="../../js/jquery.js"></script>
<style type="text/css" media="all">
...
略
...
PS C:\Users\daichi>
必要なデータを取り出すPowerShellスクリプト
次に、必要になる部分だけを抽出する処理を加える。取得したHTMLを中身を分析すると、「>東京都</td」という文字列を含んだ行に、欲しいデータが含まれていることがわかる。Select-Stringコマンドレットで東京都の気象データだけを抽出する処理を行うように、先ほどのPowerShellスクリプトを書き換える。
#!/usr/bin/env pwsh
#========================================================================
# 気温データを取得して整理する
#========================================================================
$URL = 'https://www.data.jma.go.jp/obd/stats/data/mdrr/tem_rct/alltable/mxtemsad00.html'
$SrcFile = New-TemporaryFile
curl --get $URL > $SrcFile 2> $null
#========================================================================
# 必要な部分のデータを抽出する
#========================================================================
Get-Content $SrcFile |
Select-String '>東京都</td'
#========================================================================
# 作業用の一時ファイルを削除
#========================================================================
Remove-Item $SrcFile
実行すると次のようになる。
PS C:\Users\daichi> .\test-2.ps1
<tr class="mtx"><td style="white-space:nowrap">東京都</td><td style="white-space:nowrap">西多摩郡奥多摩町</td><td style="wh
ite-space:nowrap">小河内(オゴウチ)</td><td style="text-align:right;white-space:nowrap;">15.2 ]</td><td style="text-align:
/td><td style="text-align:left;white-space:nowrap;"></td></tr>
<tr class="mtx"><td style="white-space:nowrap">東京都</td><td style="white-space:nowrap">青梅市</td><td style="white-space:
"text-align:left;white-space:nowrap;"></td></tr>
<tr class="mtx"><td style="white-space:nowrap">東京都</td><td style="white-space:nowrap">練馬区</td><td style="white-space:
...
略
...
PS C:\Users\daichi>