pdf の気温データを一括で抽出する

環境計測データが pdf 形式で 600ファイルぐらいある。
午前10時の気温だけを一括で抽出せよと天からのお告げがあった。
肝心の pdf ファイルは手元になくて、内容がよくわからないけれども、いろいろ推測して作戦をたてる。

# 作戦

pdf ファイルは日ごとのファイルかな。仮に日時がファイル名になっていると考えます。
時刻ごとに測定をするので、多分表の形式になっているのではないかな。
それを元に・・・

1.pdf をテキスト化
2.grep で10時の行を抽出
3.気温のカラムを awk で抽出


# サンプルデータ


適当な pdf がなかったので、以下のサイトを印刷時に pdf 化してファイルを作った。

https://www.data.jma.go.jp/stats/etrn/view/hourly_s1.php?prec_no=56&block_no=47600&year=2025&month=4&day=15&view=

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/20766e05-041f-4321-a963-af3bab5aca54.png)

「amedas輪島20250415.pdf」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/23c6cb36-9cde-4f31-a2f2-a6969491bbb4.png)

このようにして、以下の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日 （１時間ごとの値）
全天 雪(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ページのデータは、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a4a379ec-b033-4bc7-9c3f-e99005678e74.png)
該当箇所の pdf は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/84f1850e-8b6d-4cd4-b7bf-8e81eb08df8d.png)

一見ちゃんとしたレイアウトになっているけれども、降水量のデータが -- となっているところが、pdftotext で改行が入っていることが原因のようだ。

これの対応として、pdftotext のオプションで、 `-layout`オプションを使うと pdf のレイアウトのようにテキスト化する。

```
2025/04/16 10:51                                              気象庁｜過去の気象データ検索
 輪島（石川県) 2025年4月14日 （１時間ごとの値）
  時 現地気圧(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 の形式によって適切に抽出方法を工夫する必要がある。