🐓

EXCEL仕様書をデータとして活用する(VeletaでGo)

2024/10/29に公開

はじめに

弊社では、2024年10月23日に Japan DX Week の会場で、新製品の Veleta をローンチしました。

https://www.atpress.ne.jp/news/410896

お披露目の場なので、ミニセミナーと称して、デモをしまくりました。
デモのネタをこちらのブログでも「VeletaでGo」というシリーズ?でいくつか投稿中です。

ですが、この記事は、Mashu です。

Mashu

Mashu は、弊社が販売しているデータカタログの SaaS です。

https://services.robon.co.jp/fabric/product/mashu

Mashu は、データベースやデータレイク、データウェアハウスからメタデータを収集します。
気の利いた開発ベンダーであれば、データベースの中にも論理名をコメントとして残してくれているので、Mashu は、コメントも全部吸い上げてくれます。

ところが、イマイチな開発ベンダーさんだとコメントが入っていないので、生の物理名と暗号解読の戦いになります。

ですが、そんな開発ベンダーさんでも、EXCELのテーブル仕様書を納品してくれている可能性はかなり高いです。

データベースから自動でメタデータを抽出するだけでなく、EXCELのテーブル仕様書も自動でなんとかなりませんか?

CSVエクスポートとインポート

Mashu は、CSVファイルで論理名と説明をインポートできます。
Mashu にインポートするには、Mashu のキー情報が必要になりますので、まずは、エクスポートします。

エクスポートした CSV は、以下のような形式になっています。

https://github.com/take0a/xls2csv/blob/master/src/testdata/orca_input.csv

これにテーブル仕様書から論理名と説明を差し込みます。

論理名と説明以外の情報も残したいんですけど…
という場合には、カスタムタグとして、CSVインポートすることで対応できます。

カスタムタグとしてエクスポートした CSV は、以下のような形式になっています。

https://github.com/take0a/xls2csv/blob/master/src/testdata/lgov_tag_input.csv

これに、カスタムタグの属性とした値を差し込みます。

xls2csv

「差し込みます」と書きましたが、手作業でやったら膨大な時間がかかりますので、プログラムを作りました。

まずは、論理名と説明から

https://github.com/take0a/xls2csv/blob/master/src/main.go

先頭は、プログラムにパラメータとして渡すデータ構造の定義で、Settings が親玉で、テーブルの論理名と説明、カラムの論理名と説明が、どのEXCELファイルのどのシートのどの列に書かれているかを指定します。

プログラムの構造は単純で、まず、readXxx で、指示されたとおりに EXCEL を読み込んで、物理名に対応した論理名と説明をマップにして辞書を作ります。
そして、CSV を読みながら、辞書にあったら、論理名と説明を差し込みに行きます。

次に、カスタムタグ

https://github.com/take0a/xls2csv/blob/master/src/tag.go

基本的に、論理名と説明のプログラムと同じ構造です。カスタムタグの項目の順に指定された列の値を CSV に差し込みます。

このように xls2csv は単純なので、Go言語の処理系さえインストールすれば、簡単・高速にコンパイルできます。make がなければ、

https://github.com/take0a/xls2csv/blob/master/Makefile#L8-L9

のように go build で OK です。

使い方は、こんな感じで

https://github.com/take0a/xls2csv/blob/master/demo/05/xls2csv.sh

EXCEL のファイル名とシート名、論理名は alias、説明は description にカラムの位置を指定します。

https://github.com/take0a/xls2csv/blob/master/demo/05/orca.json

ちなみに、demo フォルダは、イベント会場でライブデモした資材です。

GoでもEXCEL

さて、xls2csv が簡単に実現できたのは、roboninc/xlsx のおかげです。
Go言語で EXCEL 処理というと、以下の2つが有名だと思います。

https://github.com/tealeg/xlsx

https://github.com/qax-os/excelize

tealeg/xlsx は、わかりやすくて、高速で、最初はこちらを使っていたのですが、一時、更新が止まっていたこともあって、excelize に浮気したメンバーもいたのですが、当時の excelize には、列コピーなど非常に遅い処理があって、プルリクでも作ろうかとも思ってソースコードを見たのですが、私の趣味とは合わないようでして(個人的な感想ですw)いろいろと探したところ、以下のものを見つけました。

https://github.com/plandem/xlsx

これは、高速で、ソースコードもわかりやすかった(個人的な感想です)のですが、メンテナンスが止まっていて、かつ、いくつか修正が必要な箇所があったので、ROBON でメンテナンスをすることにしました。上の xls2csv でも、ROBON 版の roboninc/xlsx を使用しています。

https://github.com/roboninc/xlsx

オリジナルと同様、MITライセンスのままにしていますので、ライセンスの範囲でご自由にお使いください。

おわりに

ROBON では、今回ご紹介した roboninc/xlsx だけでなく、過去の技術ブログでもご紹介しました roboninc/sqlx もオープンソースとしてメンテナンスしています。これらのオープンソースのメンテナンスに興味のある方、ご連絡をお待ちしております。

https://github.com/roboninc/sqlx

GitHubで編集を提案
株式会社ROBONの技術ブログ

Discussion