monolithic kernel

Excel のワークシートを CLI で TSV に変換する

どうもこの業界で Excel から逃げ切るのは困難を極めるらしく、ギョームの中でどうしても .xls とか .xlsx のファイルと向き合う場面が出てきてしまいます。今回は、私の Excel ファイルとの付き合い方をご紹介します。

私は、LibreOffice を使って Excel ファイルを処理しています。LibreOffice は CLI のオプションが充実していて、--headless--convert-to オプションを使うと GUI を一切使わずにファイルの変換ができてしまうのです。

soffice --headless --convert-to csv --infilter=CSV:9,34,UTF8 $1

デフォルトだと入力ファイル名の拡張子を .csv に変えたものが出力されるのですが、それだと若干不便なので標準出力に出すためのラッパーを書いてみました。

https://gist.github.com/mono0x/5a359cbec4c7cefb3b50

これを使うと、以下のようにパイプで使い慣れたコマンドに渡して処理できます。

xls2tsv input.xlsx | awk -F"\t" '{print $3}' | sort | uniq > output.txt

ただ、どうやって処理すればよいかを考える段階では結局 Microsoft Excel を起動してるんですけどね。若干本末転倒な感はありますが、同じ形式のファイルを連続して処理するのであればバッチ処理できるのはうれしいです。

それと、地味によいのが、CSV や TSV で出力しようとしたときの Excel の互換性についての余計なお世話と無縁になれることです。毎回表示される確認に答えるお仕事はもうしたくありません。

さらに地味によいのが、改行コード LF で文字コードに UTF-8 を指定して出力できることです。Excel で CSV や TSV を出力しても、改行コード CRLF の UTF-16 というテキストでありながらテキストとは認めたくないファイルになってしまうので、それをいちいち変換する手間が掛かりますが、LibreOffice のコマンドを叩けばそういった手間はありません。

日々 Excel ファイルと格闘する皆さん、ぜひお試しください。