環境計測データが pdf 形式で 600ファイルぐらいある。
午前10時の気温だけを一括で抽出せよと天からのお告げがあった。
肝心の pdf ファイルは手元になくて、内容がよくわからないけれども、いろいろ推測して作戦をたてる。
作戦
pdf ファイルは日ごとのファイルかな。仮に日時がファイル名になっていると考えます。
時刻ごとに測定をするので、多分表の形式になっているのではないかな。
それを元に・・・
1.pdf をテキスト化
2.grep で10時の行を抽出
3.気温のカラムを awk で抽出
サンプルデータ
適当な pdf がなかったので、以下のサイトを印刷時に pdf 化してファイルを作った。
このようにして、以下の3つのファイルを作成。
- amedas輪島20250413.pdf
- amedas輪島20250414.pdf
- amedas輪島20250415.pdf
600 ファイルではなく、この3つのファイルでテスト。
環境
- Ubuntu 24.04 LTS
WSL でもできるハズ
下準備
pdftotext をインストール
$ sudo apt install poppler-utils
pdf をテキスト化
$ pdftotext amedas輪島20250413.pdf
うん? 何も表示がないぞと思ったら、 amedas輪島20250413.txt ができていた。明示的に出力ファイルを指定するには以下のようにする。
$ pdftotext amedas輪島20250413.pdf amedas輪島20250413.txt
できたtxt ファイル。
2025/04/16 10:51
気象庁|過去の気象データ検索
輪島(石川県) 2025年4月13日 (1時間ごとの値)
全天 雪(cm)
気圧(hPa) 降水量 気温 露点
蒸気圧 湿度 風向・風速(m/s) 日照
視程
時 現地
温度
時間
日射量
(mm)
(℃)
(hPa)
(%)
海面
風速 風向 (h) (MJ/㎡) 降雪 積雪 天気 雲量 (km)
(℃)
1 1007.7 1008.5
-- 12.1 8.8 11.3 80 3.3 南西
-- -20.0
2 1006.8 1007.6
-- 12.3 8.8 11.3 79 2.6 南南西
-- -20.0
3 1005.7 1006.5
-- 12.7 8.8 11.3 77 4.4 南南西
-- -20.0
4 1005.1 1005.9
-- 12.3 8.8 11.3 79 3.8 南西
-- -20.0
5 1003.9 1004.7
-- 12.1 8.9 11.4 81 2.8 南
-- -20.0
6 1003.2 1004.0
-- 12.9 8.8 11.3 76 4.6 南西 0.0
-- -20.0
7 1003.3 1004.1 0.0 15.4 8.4 11.0 63 5.3 南 0.0
-- -20.0
8 1002.5 1003.3 0.0 14.4 9.6 12.0 73 3.8 南 0.0
-- -18.4
9 1001.6 1002.4 1.0 14.7 10.7 12.9 77 4.9 南 0.0
-- -20.0
10 1001.0 1001.8 0.0 15.4 10.6 12.8 73 3.5 南 0.0
-- -20.0
11 1000.7 1001.5 0.5 14.9 12.0 14.1 83 1.6 北 0.0
-- -18.1
12 999.8 1000.6 1.0 15.2 11.6 13.6 79 2.8 南南西 0.0
-- -20.0
・
・
・
grep で10時の行を抽出
行頭に10があるのが時刻っぽいので
$ grep ^10 amedas輪島20250413.txt
とすると以下の行が得られた。
10 1001.0 1001.8 0.0 15.4 10.6 12.8 73 3.5 南 0.0
気温のカラムを awk で抽出
5カラム目が気温なので、先程の grep をパイプで awk に流す。
$ grep ^10 amedas輪島20250413.txt | awk '{print $5}'
気温が出た。
15.4
一括処理
以下のようにしようとしたら、
$ pdftotext amedas輪島202504*.pdf
何てことだ、pdftotext はワイルドカードが使えないぞ。
しかたがない、
$ for file in amedas輪島202504*.pdf; do pdftotext "$file" "$file.txt"; done
として、
- amedas輪島20250413.pdf.txt
- amedas輪島20250414.pdf.txt
- amedas輪島20250415.pdf.txt
を得る。
それに対し、
$ grep ^10 amedas輪島202504*.txt | awk '{print $1,$5}'
とすると
とすると以下が出てくる。
amedas輪島20250413.pdf.txt:10 15.4
amedas輪島20250414.pdf.txt:10
amedas輪島20250415.pdf.txt:10 11.0
やれやれ、終わり終わり・・・と思ったら、4月14日のデータが無いぞ。
異常データの対応
4月14日の該当箇所は・・・
10 1003.4 1004.2
-- 13.4 4.6 8.5 55 4.0 南南西 0.8
-- -20.0
元になったWebページのデータは、
一見ちゃんとしたレイアウトになっているけれども、降水量のデータが -- となっているところが、pdftotext で改行が入っていることが原因のようだ。
これの対応として、pdftotext のオプションで、 -layout
オプションを使うと pdf のレイアウトのようにテキスト化する。
2025/04/16 10:51 気象庁|過去の気象データ検索
輪島(石川県) 2025年4月14日 (1時間ごとの値)
時 現地気圧(hPa) 降水量 気温 露点 温度 蒸気圧 湿度 風向・風速(m/s) 日照 全天 雪(cm) 視程
海面 (mm) (℃) (℃) (hPa) (%) 風速 風向 (h) (MJ/㎡) 降雪 積雪 天気 雲量 (km)
時間 日射量
1 1006.3 1007.1 0.5 6.8 6.1 9.4 95 1.5 南南西 -- -- 7.90
2 1005.8 1006.6 1.0 6.2 5.0 8.7 92 1.6 南南西 -- -- 13.0
3 1005.4 1006.2 0.5 6.1 4.8 8.6 91 2.5 南南東 -- -- 20.0
4 1004.7 1005.5 0.0 6.1 4.3 8.3 88 3.2 南南西 -- -- 20.0
5 1004.4 1005.2 -- 6.2 4.4 8.3 88 4.5 南 -- -- 20.0
6 1003.7 1004.5 -- 6.7 4.4 8.3 85 5.6 南 0.0 -- -- 20.0
7 1003.6 1004.4 -- 7.7 4.8 8.6 82 5.0 南 0.7 -- -- 20.0
8 1003.7 1004.5 -- 9.7 5.5 9.0 75 4.2 南南西 1.0 -- -- 20.0
9 1003.6 1004.4 -- 11.8 5.7 9.1 66 2.4 南 1.0 -- -- 20.0
10 1003.4 1004.2 -- 13.4 4.6 8.5 55 4.0 南南西 0.8 -- -- 20.0
11 1003.3 1004.1 -- 13.9 3.1 7.6 48 5.3 南西 0.3 -- -- 20.0
12 1002.2 1003.0 -- 14.6 3.4 7.8 47 3.8 南 0.8 -- -- 20.0
・
・
・
これに対応して以下のようにするとうまくいかない。
$ for file in amedas輪島202504*.pdf; do pdftotext -layout "$file" "$file.txt"; done
bash の do のパラメータが2つまでのようので、以下のようにして対処
$ for file in amedas輪島202504*.pdf; do pdftotext -layout "$file"; done
変更に対応して、以下のようにして抽出
$ grep ^" 10" amedas輪島202504*.txt | awk '{print $1,$6}'
得られたもの。
amedas輪島20250413.txt: 15.4
amedas輪島20250414.txt: 13.4
amedas輪島20250415.txt: 11.0
これをコピペして適当に加工すれば良い。
ほかのデータの対応
なお、今回はテスト用データなので、 pdf の形式によって適切に抽出方法を工夫する必要がある。