エクセル方眼紙の無駄をエクシェル芸で遠回しに指摘する。
Fri Mar 28 20:42:25 JST 2014 (modified: Sun Oct 1 10:50:27 JST 2017)
views: 2933, keywords:Excel方眼紙,ポインタが悲鳴,シェル芸,エクシェル芸 この記事は最終更新日が7年以上前のものです。
上田です。カーネル読書会に潜入中です。
ここ2日、連続でExcelファイルをシェル芸でほじる記事を書きましたが、副会長から、エクシェル芸という名称をいただきました。使わせていただきます。有り難うございます。
シェル芸拡張 エクシェル芸が誕生した瞬間 #シェル芸 #usptomo http://t.co/llzq8qTM5w
— (っ´A`)っ ゃー (@nullpopopo) 2014, 3月 26
Excelと言えば、最近、これとかこれとか、エクセル方眼紙が話題になっています。
なぜエクセル方眼紙がいけないのか。データとレイアウトと操作が一緒くたになっているとか、別のアプリからデータが使えず再利用性に問題とか、貴重な労働時間が削減されるとか、いろいろありますが、そういう話は他の人に任せて、ここ二日で紹介したExcelをunzipして中のXMLファイルをほじくる手法でエクセル方眼紙を観察してみます。非常に遠回しですが、やはり「エクセル方眼紙は無駄だ!!」という結論が得られております。
まず、方眼紙でないファイルを用意しました。下の図のようなものです。少々ネタが古いです。
さて、解凍してみます。文字列はxl/sharedStrings.xmlに入っています。
ueda@remote:~/tmp$ unzip *
ueda@remote:~/tmp$ cat xl/sharedStrings.xml | hxselect si | sed 's;</si>;&\\n;g'
<si><t>ダァシエリイェス</t><phoneticPr fontId="1"/></si>
<si><t>ダッ・・・ァシエリイェス</t><phoneticPr fontId="1"/></si>
このファイルのsi要素に、上から0,1番と番号を振り、それをsheet1.xmlで参照しています。
ueda@remote:~/tmp$ cat xl/worksheets/sheet1.xml | hxselect c | sed 's;</c>;&\\n;g'
<c r="A1" t="s"><v>0</v></c>
<c r="A2" t="s"><v>1</v></c>
数字のときはv要素の中に数字が入っていましたが、文字列のセルの場合はc要素にt="s"という目印を付けた上でv要素の中にポインタが入っています。
しかし、sharedStrings.xml、si要素にidを付けずに順序で番号をつけるとは・・・。そんなにファイルを小さくしたいか?
さて、この文字列を表現するのにどれだけデータがあるか数えてみましょう。
ueda@remote:~/tmp$ cat xl/sharedStrings.xml | hxselect si | wc
c-146
ueda@remote:~/tmp$ cat xl/worksheets/sheet1.xml | hxselect c | wc
c-56
合計202バイトです。テキストだと改行コードを入れて68バイトなので、3倍くらい容量があります。まあ、便利さと引き換えにするとそんなべらぼうでもありません。ただ、Excelファイル全体では26232バイトもあるわけですが、まあ今時そんなに目くじらを立てるほどのものでもありません。XMLだしシェル芸で読めるのでそんなに怒る必要もないかと。
んで次に、方眼紙バージョンです。
あ、発狂しないでください発狂しないでください。発狂するのはまだ早いわ!
sharedStrings.xmlとsheet1.xmlから文字の部分を引っ張りだしてみましょう。
ueda@remote:~/tmp$ unzip *
ueda@remote:~/tmp$ cat xl/sharedStrings.xml | hxselect si | sed 's;</si>;&\\n;g'
<si><t>タ</t><phoneticPr fontId="1"/></si>
<si><t>゙</t><phoneticPr fontId="1"/></si>
<si><t>ァ</t><phoneticPr fontId="1"/></si>
<si><t>シ</t><phoneticPr fontId="1"/></si>
<si><t>エ</t><phoneticPr fontId="1"/></si>
<si><t>リ</t><phoneticPr fontId="1"/></si>
<si><t>イ</t><phoneticPr fontId="1"/></si>
<si><t>ェ</t><phoneticPr fontId="1"/></si>
<si><t>ス</t></si>
<si><t>ッ</t><phoneticPr fontId="1"/></si>
<si><t>・</t><phoneticPr fontId="1"/></si>
ueda@remote:~/tmp$ cat xl/worksheets/sheet1.xml | hxselect c | sed 's;</c>;&\\n;g'
<c r="A1" t="s"><v>0</v></c>
<c r="B1" t="s"><v>1</v></c>
<c r="C1" t="s"><v>2</v></c>
<c r="D1" t="s"><v>3</v></c>
<c r="E1" t="s"><v>4</v></c>
<c r="F1" t="s"><v>5</v></c>
<c r="G1" t="s"><v>6</v></c>
<c r="H1" t="s"><v>7</v></c>
<c r="I1" t="s"><v>8</v></c>
<c r="A2" t="s"><v>0</v></c>
<c r="B2" t="s"><v>1</v></c>
<c r="C2" t="s"><v>9</v></c>
<c r="D2" t="s"><v>10</v></c>
<c r="E2" t="s"><v>10</v></c>
<c r="F2" t="s"><v>10</v></c>
<c r="G2" t="s"><v>2</v></c>
<c r="H2" t="s"><v>3</v></c>
<c r="I2" t="s"><v>4</v></c>
<c r="J2" t="s"><v>5</v></c>
<c r="K2" t="s"><v>6</v></c>
<c r="L2" t="s"><v>7</v></c>
<c r="M2" t="s"><v>8</v></c>
うわああああああああああああ!!!!と興奮することもないですが、結構前立腺肥大しています。サイズは、と・・・
ueda@remote:~/tmp$ cat xl/sharedStrings.xml | hxselect si | wc
c-449
ueda@remote:~/tmp$ cat xl/worksheets/sheet1.xml | hxselect c | wc
c-619
1kB超えてますね。たかがダァシエリイェッスに1kB超です。
しかし、サイズについてはいいんです。1kBくらいどうってことありません。しかし何が悲しいかというと、エクセルがsheet1.xmlに文字列を埋め込まずに別にXMLを準備して文字列を格納し、それをsheet1.xmlからポインタで参照する構造にしているのに、そのポインタが巨大化してかえって全体として肥大化しているということです。
#マイクロソフトのもくろみではこの構造の方が節約できる
<c r="A1" t="s"><v>0</v></c>
<c r="A2" t="s"><v>0</v></c>
<si><t>タ</t><phoneticPr fontId="1"/></si>
#でもこうした方が小さいという・・・
<c r="A1"><v>タ</v></c>
<c r="A2"><v>タ</v></c>
ポインタの方がでかいという・・・。
M社のデータ構造の想定の遥かに上を行くExcel方眼紙こわいということで、この話はおしまいにします。・・・あなたのPCにも、こんなXMLが・・・
おしまい。