gitで管理しているエクセルファイルに修正が入った時に、確認するのが面倒だなーと思った時の話です。
やりたいこと
エクセルファイルのセルの内容だけを差分比較するためにcsvファイルに変換してmasterブランチの状態と比較するスクリプトを作りました。
エクセルファイル(.xls)からcsvファイルへの変換にはpythonのライブラリであるcsvkit
に含まれるin2csv
というコマンドを使いました。
基本的に修正をする場合はgitでブランチを切ってプルリクを出す流れになっているため、作業ブランチとmasterブランチで比較する方法にします。
作業環境
環境 | バージョン |
---|---|
macOS | High Sierra 10.13.6 |
python | 3.6.4 |
csvkit | 1.0.4 |
python2系でcsvkitをインストールしようとしたらエラーになったことがあるので、python3系を使う方が望ましいと思います。
方法
python3とpipが使える状態を想定しています。
まずはインストール
pip install csvkit
これが成功するとグローバルにscvkitがインストールされて、in2csvというコマンドが使えるようになります。
階層を指定してインストールするならばコマンドのフルパス指定すれば使えるようになるはずです。
この状態で下記のようなシェルスクリプトを作って実行すると、対象のディレクトリに含まれてるエクセルファイルの中身の差分を簡易的に表示させることができます。
#!/bin/bash
# 使うパスを変数に入れておく
SCRIPT_ROOT=$(cd $(dirname $0);pwd)
PROJECT_ROOT=$(cd $(dirname $0);cd {検証スクリプトからプロジェクトルートまでの相対パス};pwd)
# git archiveを使うため、プロジェクトルートに移動しておく
cd ${PROJECT_ROOT}
EXCEL_DIR="path/some_excel_file_dir"
MASTER_RULE_ROOT="${SCRIPT_ROOT}/tmp"
CURRENT_RULE_ROOT="${PROJECT_ROOT}/${RULE_DIR}"
mkdir -p ${MASTER_RULE_ROOT}
# masterブランチの特定フォルダをtmpディレクトリ以下におく
git archive master:${EXCEL_DIR} | tar -x -C ${MASTER_RULE_ROOT}
for current_file in `find ${CURRENT_RULE_ROOT} -name "*.xls"`
do
target_file_name=$(basename $current_file)
master_file=$(find ${MASTER_RULE_ROOT} -name "${target_file_name}")
echo $target_file_name
diff <(in2csv $current_file 2>/dev/null) <(in2csv $master_file 2>/dev/null)
done
# 使い終わったので削除
rm -rf ${MASTER_RULE_ROOT}