pycgettbというpythonパッケージを作りました

年末前に今年ちょっとした目標だったちょっとしたツールをPyPIに登録しました。PyPIデビューっていい響きですw

pycgettb 0.1.2 : Python Package Index

hrsano645/pycgettb

このパッケージ、と言いますか同梱のコマンド(pysgettbcli)のほうが主役です。このコマンドの機能を一言で言うと帳票チックなExcelファイルからデータを吸い出してテキストデータにしてくれます。

吸い出す元のExcelファイルと同じ形で抜き出したい場所に対して特別なフォーマットの文字列を埋め込み、その文字列と同じ名前を変数名としてjinja2テンプレートを作る事で、テキストファイルにしてくれます。

言葉で説明するのがまだ腑に落ちないのもあって、具体的な使い方については英語のREADMEか日本語で書いたREADMEを見ていただければと思います。 ただ英語のREDAMEは翻訳サービスベースなのでちゃんとしたものになってないでとりあえず日本語のREADMEを見ていただければと。英語苦手なままです。。

pycgettb/README.ja.rst at master · hrsano645/pycgettb

なぜ作ったか?

このパッケージには元となるその場しのぎレベルのスクリプトがありますが、本業でよく使うシチュエーションがあったので作りました。

本業(家業)は自動車プレス金型設計事務所にいますが、プレス金型では圧力に関する計算を良くします。そのときに手計算は面倒なのもあってExcelで計算をして結果が見れるようにしています。

その計算結果を今までは主に2次元の図面上に「手入力」してもらっていたのですが、流石に見るに堪えない思いもありどうにかしたいと考えていました。

Excelで入力したセルのデータを吸い出してどうにかしようとした時の選択肢は、Excel VBAで計算した結果を別のファイルに出力したり、何かしらの方法で渡す手段を用意するのが普通ですかね? ファイル出力は実装したこともありますが、言わずもがな言語仕様も扱いづらい事もあって面倒です。

他にはPythonなどの別の環境からExcelのファイルを読み込んでパーサー処理をするがあります。pythonならxls, xlsxにそれぞれ対応したライブラリがあります。

しかし、VBAでも他の言語環境を経由しても、いちいちコーディングしてユーティリティとしてアプリを作る必要があります。必要に応じて図面の形は変わることもありますし、 気分 都合上でExcelのファイルを変えたときにまたコードを変えないといけません。これもまた面倒です。

なので毎回パーサーを書かずに(パーサーのみを書いてルール化することも考えましたが)サクッとデータを吸い出す方法を考えていたましたが、一つ思いつきました。

Excelなどの表計算ソフトはセルのアドレスによってデータを置くので、セルのアドレスと置かれているデータのマッピングさえ行えってしまえば吸い出し出来るし、アドレスをマッピングした情報を簡単に用意すればいいだけです。

そのアイディアを、pycgettbではソースデータとソーステンプレートと言う2つの同じ書式で、ソースデータには吸い出したい元のExcelファイル, ソーステンプレートはソースデータから抜き出したいセルのアドレスに任意の変数名を書いて、pycgettb内部でマッピングすることにしました。

そこからどういったデータを作るか?かはファイルとして置いておけば使いやすいのでテキストファイル形式で作ることにしました。Pythonで言ったらJinja2テンプレートが自由度が高い定義方法だと思って利用しています。jinja2ならHTMLでもCSVでもjsonでもテンプレートを書ければ変換出来ます。

2次元の図面は業界標準らしいdxfファイルがあります(テキストタイプとバイナリタイプとあり、テキストタイプはよく使われる) テキストなので、埋め込みたい文字を予めCADで作っておけばjinja2テンプレートとして扱うことが出来ます。

地道ながら頑張ります

pycgettb自体、何に使えるかと言うと、Excelのデータを吸い出したいなら大抵何でも使えると思います。帳票で集めたxlsxファイルをまとめてファイルを作った上でデータベースに落としたり、jsonファイルを生成できるようにしてjupyter notebookで読ませるなどなど。

オープンデータ界隈でもExcelファイルはよく見るので、その方面でも使えると面白そうです。テストを書いていたのがシビックテックミートアップの懇親会の後だったので、そんなことも考えながらです。

今後は便利にマッピング出来る機能を幾つか追加したり、プログラミングをしなくても良いアイディアをもっと全面に出せるように、GUIフロントエンドを用意したいです。そのために各プラットフォームにコマンドラインのバイナリが必要ですね。

ということで初めてPyPIデビューした話でした。PyPIへのデビューの仕方を検索するといろいろと参考になる情報がありましたが、結局のところはPyPAのサンプルプロジェクトを参考にしていまして、その辺の話は来年また話題にできたらと思います。

公開してからまたほったらかしだけど地道に進めれればと思います。まだアイディアをとりあえず形にしたレベルで表立って利用してほしいといえるほどではないのですが、機能周りでもフィードバック頂けるととても嬉しいです。

pycgettb 0.1.2 : Python Package Index

巻末ですが今年最後の更新としまして(ギリギリですが)来年も宜しくお願い致します。良いお年を!

About Me

買ったり作ったり考えたり試したの日々の記録です