😡

内閣府が配布している国民の祝日の CSV ファイルをいい感じに加工するシェルスクリプト

2023/12/06に公開

国民の祝日の CSV ファイル

  • ここから入手できる
  • 今日 (2023/12/06) 現在、1955 年から 2024 年の祝日が記載されている

https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv

スクリプトの中身

  • 出力フォーマットは TypeScript ファイルにコピペできるような形式になっている
# syukujitsu.csv から ts の配列の中身を生成する
# YEAR に入れた年の祝日だけを抽出する
# syukujitsu.csv のフォーマットは以下
#   2024/1/1,元日
# 出力するフォーマットは以下
#   { year: 2024, month: 1, date: 1, name: '元日' },

YEAR=2024

# ディレクトリ移動
cd `dirname $0`
# Shift-JIS から UTF-8 に変換
nkf -w ./syukujitsu.csv | \
# 改行コードを LF に変換
tr -d '\r' | \
# 1行目を削除
sed -e '1d' | \
# 年月日を抽出 -> 2024/1/1 元日
awk -F, '{print $1,$2}' | \
# 年月日をスラッシュで分割 -> 2024 1 1 元日
awk -F/ '{print $1,$2,$3}' | \
# 年月日と祝日名を出力 -> { year: 2024, month: 1, date: 1, name: '元日' },
awk '{print "{ year: "$1", month: "$2", date: "$3", name: '\''"$4"'\'' },"}' | \
# 年でフィルタ
grep $YEAR

ポイント

  • syukujitsu.csv の文字コードは Shift JIS なので nkf コマンドで UTF-8 に変換している 😡
    • Mac なら brew install nkf で入る
# Shift-JIS から UTF-8 に変換
nkf -w ./syukujitsu.csv
  • syukujitsu.csv の改行コードは CRLF なので tr コマンドで LF に変換している 😡
# 改行コードを LF に変換
tr -d '\r'

余談

  • このスクリプトはコメントだけ自分で書き、あとは GitHub Copilot に書かせようとした
  • 文字コードの問題は、出力が文字化けしているのですぐに自力解決できた
  • 改行コードの問題は原因がすぐには分からず VSCode 拡張の Copilot Chat に聞いたが解決できなかった
    • 出力形式がこんな感じなので改行コードっぽいということがわかり、tr コマンドで解決した
' },ar: 2024, month: 1, day: 1, name: ' 元日
' },ar: 2024, month: 1, day: 8, name: ' 成人の日
' },ar: 2024, month: 2, day: 11, name: ' 建国記念の日
...
  • 後で知ったが、国民の祝日の CSV は「ひどい CSV」として有名らしい

https://softantenna.com/blog/naikakufu-shukujitsu-csv-format/

Discussion