4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

gitで管理しているエクセルファイルの差分を確認する

Posted at

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}
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?