課題

経済産業省の「製造工業生産予測指数」のExcel資料「企業の生産活動マインド指標(DI)時系列表」の「animal_sp」シートを機械判読可能なデータ型CSVに加工する。

Webサイト:統計表一覧(経済産業省生産動態統計)
https://www.meti.go.jp/statistics/tyo/yosoku/result-1.html

Excel:企業の生産活動マインド指標(DI)時系列表
https://www.meti.go.jp/statistics/tyo/yosoku/animal/animalspirits.xlsx

「animal_sp」シートを表示する。

animal_spシート

加工ポイント

  • ヘッダーが2行あり、階層に別れている。
    • 大分類:原系列、トレンド(移動平均)
    • 項目:強気、弱気、DI
  • A列に「年」、B列に「月」がある。
    • 年が先頭行にしかない。
  • 296行以降は不要。

データ考察

BODIKエディタで開いてみる。

  • 0行目〜1行目はヘッダーになる。
    • 0行目は「大分類」を表す。
      • 大分類:原系列、トレンド(移動平均)
      • 下位レベル(1行目)の真ん中の列に大分類の文字列がある。
    • 1行目はデータ項目名を表す。
      • 強気、弱気、DI
  • 0列目に「年」を記している。
    • 年の先頭行にだけ「年」が記入されている。
  • 1行目に「月」を記している。

データ加工の考え方

余分な行・列

  • 後ろの行(296行以降)は削除する。
  • 9列目以降は削除する。

ヘッダー

  • 原系列の「強気、弱気、DI」、トレンドの「強気、弱気、DI」というヘッダーにしたい。
    • 0行目の、col_003~col_005に「原系列」、col_006~col_008に「トレンド(移動平均)」という文字列をセットする。
    • 0行目〜1行目を結合する。

  • col_000列の年号が、先頭行にしかない。
    • 空白部分を埋めたい。

ゴール(作成するCSV)

元データを加工して次のようなCSVを作成する。

項目ヘッダー



調査結果ベース
原系列強気(%)
原系列弱気(%)
原系列DI[強気-弱気](%p)
トレンド(移動平均)強気(%)
トレンド(移動平均)弱気(%)
トレンド(移動平均)DI[強気-弱気](%p)

解答(スクリプト)

スクリプトの解答例を示す。

解答例1

スクリプトを1行ずつ適用して結果を確認しながら進めると、このようなスクリプトになる。

スクリプト
# 後ろの不要な行を削除する
del_row 296:
# 不要な列を削除する
del_col 9:
# 「年」の行の抜けているところを埋める
fill_down col_000
# ヘッダーとして邪魔な文字列をクリアする
set_col col_000,0,0#
# ヘッダーを調整する
set_col col_003,0,0#原系列
set_col col_006,0,0#トレンド(移動平均)
# 0行目の抜けているところを埋める
fill_right 0
# ヘッダーを結合する
merge_row 0:1
# ヘッダーをセットする
set_header
説明
#
296行以降を削除する。
#
9列目以降を削除する。
#
col_000列の抜けているセルを埋める。
#
col_000列の0行目をブランクにする。
#
col_003列の0行目に「原系列」をセットする。
col_006列の0行目に「トレンド(移動平均)」をセットする。
#
0行目の抜けているセルを埋める。
#
0〜1行を結合する。
#
先頭行をヘッダーにセットする。
注意
  • set_headerスクリプトは、指定した行のデータがすべてユニークでないとエラーになる。
  • merge_rowスクリプトは、文字列を機械的に結合する。階層構造で記述された項目名を結合することでユニークな文字列になることを期待している。
  • ヘッダーとした文字列がCSVの項目ヘッダーとして適切であることを確認すること。

解答例2

解答例1では、ヘッダーを調整するところで、「原系列」「トレンド(移動平均)」という文字列をスクリプト開発者がスクリプトに記入している。
手入力すると入力ミスの可能性があるので、表データからコピペすることを推奨する。

スクリプトの「変数」を使って、加工中の表データに存在しているデータを参照することもできる。

スクリプト
# 後ろの不要な行を削除する
del_row 296:
# 不要な列を削除する
del_col 9:
# 「年」の行の抜けているところを埋める
fill_down col_000
# ヘッダーとして邪魔な文字列をクリアする
set_col col_000,0,0#
# コピー元セルのデータを変数$1にセット
set_val $1,col_004,0
# 変数$1の値をコピー先セルにセットする
set_col col_003,0,0#$1
# コピー元セルのデータを変数$1にセット
set_val $1,col_007,0
# 変数$1の値をコピー先セルにセットする
set_col col_006,0,0#$1

# 0行目の抜けているところを埋める
fill_right 0
# ヘッダーを結合する
merge_row 0:1
# ヘッダーをセットする
set_header
説明
#
296行以降を削除する。
#
9列目以降を削除する。
#
col_000列の抜けているセルを埋める。
#
col_000列の0行目をブランクにする。
#
col_004列の0行目のデータを変数$1にセットする。
#
変数$1の値をcol_003の0行目にセットする。
#
col_007列の0行目のデータを変数$1にセットする。
#
変数$1の値をcol_006の0行目にセットする。
#
0行目の抜けているセルを埋める。
#
0〜1行を結合する。
#
先頭行をヘッダーにセットする。

まとめ

  • 番号で指定する del_col, del_row などの更新系のスクリプトは、番号の大きな方から処理すると間違いが少なくなる。
  • set_headerでCSVの項目ヘッダーをセットするとき、0行目のすべてのセルのデータが重複なく設定されていないと、エラーになる。
  • 複数行のヘッダーを1つにまとめるmerge_rowは、セルのデータを機械的に結合するので、冗長な文字列になりやすい。
    重複がなくなってヘッダーとして使える場合でも、CSVの項目ヘッダーとして問題ないか?を確認する。
  • 必要に応じて、ヘッダーとなる0行目の文字列の修正を検討する。
    set_col:セル単位でデータを書き換える。
    set_row:行のデータを一括で書き換える。
  • 変数を使うことで、元のシートに存在するデータを活用し、手入力による入力ミスをなくすことができる。
BODIKエディタのスクリプトマニュアル

このページは、BODIK Utilityの BODIKエディタのスクリプト機能 のマニュアルです。 スクリプト一覧 区分 スクリプトコマンド 機能 記述例 列操作 hide_col 列を隠す hide_col <列 […]