ExcelをCleanUpする正規表現

ここ半月ほど、Excelの長大な表組みをHTMLに移し替える作業に従事していた。吐き出されたHTMLにして4万行以上、テキストのみだというのにデータ量1.3MBを越える、なかなかのヴォリュームである。

御存知の通り、Excelが吐き出すHTMLは「汚い」。Excelでの見栄えをそのまま再現することに注力するあまり、全セルに適当なclass指定、ヘッダに長い埋め込みスタイルとから始まる独自スクリプト多数、全漢字にルビ(ただし非表示)。そのままでは編集も困難、しかしセル数がセル数だけに手動での移し替え作業も困難である((Dreamweaverの最新版であればExcelの表データをコピーしてDW側でペーストするだけで表を作ってくれる機能があるのでかなり手間が省けるらしい。その結果吐き出されるソースの質は知らないが))。

じゃあ、元々HTMLではあるのだから、どうにかして余分なものを取り除いたら使えるようになるんじゃないか。そういうわけで、試行錯誤を繰り返し3日ほどかけて下処理用の正規表現を作り上げた。


下準備だけで何日もかけるのは、作業効率としてはあまり良い方法ではないかも知れない。ただしそれは1回限りの作業での話で、長期的な展望に立てば次回以降は準備期間がなくなる分作業効率は劇的に向上する筈だ。実際、手作業なら5日ぐらいかけそうな作業量を、準備完了後は半日で終えることができるようになった。クライアント側でのデータ差し替えの影響で、同じ箇所を都合3回ぐらい編集したのだが、これ全部手作業だったら死んでるところだ。

正規表現

これらは実際の作業をmiで行なっている。従って正規表現も、miに実装された機能を前提としており、部分的には他のエディタなどでの実装と異なるかも知れない。
特にリターン/タブを含めた表記になっているので、そのままでは移植できない部分もある。一応半角スペースは\s、 タブは\t、リターンは\r(Macなので改行コードCRで作業している。WinならCR/LFなので\r\nとする必要があるだろう)に置き換えた。
また、これは今回用いたExcelベースのHTMLでは通用したが、その他でも同じように機能するかどうか確証はない。必要に応じ、適宜修正の上利用されたい。

途中改行の削除
検索文字列
([^>])
置換文字列

Excel-HTMLは長い文字列を適当なところで改行する。その結果として、属性を含むタグの置換などの際、不規則に改行などが含まれ置換を困難にしている。ひとまずタグの区切り以外での改行をすべて削除した。

不可視属性の削除
検索文字列
<span[^(style)]*style='display:[^(none)]*none'>.*?</span>
置換文字列

不可視にしている部分は不要なデータと判断、中身ごと削除する。
多分もっとスマートに書けるのではと思うが、思い付く限りの方法で短縮を試みたものの巧く機能しなかった。

Table要素以外の削除
検索文字列
(<[^t][^>]*>)+([^<]*)(</[^t][^>]*>)+
置換文字列
$2

つまり<t以外から始まり</t以外で終わるタグ部分だけを削除、間に挟まれた<以外の文字(即ちタグでない部分)を残す。

スタイル他、余分な属性の削除
検索文字列
((style)|(x:fmla)|(width)|(height))=[^>]*
置換文字列

様々な鬱陶しい属性、中心的には見栄え再現のためのインラインスタイルだが、そうした余分なものを切り落とす。


多分これだけで、かなり不要データが削除できるのではないかと思う。


当然ながら他にもこの種の情報がいくつか。