ワークスINDEXへ
テキストファイルやExcelシートをSELECT文で見てみる  2002/01/06
『ExcelからSELECT文を発行する』と言う事ではありません。テキストファイルやエクセルシートに対して、 SELECT文を発行する方法について書いていきます。つまり、これらのファイルを、あたかも RDBMS のテーブルであるかのように扱う、と言う事です。 
 
テキストの検索に関しては『grep 使えばいーじゃん』と言うご意見もあるでしょう。 実際、私自身は DOS版grep や シェアウェアの Qgrep を使っていますが、単純な grep だけでなく、 複数のファイルを使って複雑なクエリーを行う場合には、join や sort や uniq などのコマンドをパイプして使う必要があります。さらに複雑になれば、sed awk perl なども使うことになりましょう。 
 
もちろん、そちらの方が楽、と言う人もいるでしょうが、 Windows ユーザー に限って言えば、どちらかと言うと、 『grep の使い方なんて知らないけどSQLは知ってるよ』と言う人の方が多いのではないでしょうか。 
 
と言うわけで、若干(かなり?)のこじつけも含みつつ、実装方法について述べて行こうと思います。 まあ、要するに、このページについてはシュミシュミな世界と言う事です。(^_^;

■まずはODBCドライバの準備

コントロールパネルで ODBCデータソースアドミニストレータを開きます。Microsoft Text Driver を選択し、更に CSVファイルのある任意のディレクトリを選択。テキストファイルであれば、タブ区切りでもよいし、 何となれば単なる文章オンリーのテキストでもかまいません。 また、1行目に列名が入っているなら、書式の定義で1行目を列名として使う設定にしましょう。 
 
私は、逆引きSQL比較で使っているテーブルと同じレイアウトのCSVファイルを準備し、 データソース名を testcsv としました。
 
ここまでできれば、後はSQL文を発行するだけです。

■使うツールはお好みで

さて、実際にSQL文を発行するわけですが、ODBC接続が可能なツールであれば、何でもよいです。
ご自分で作った VB や VC++ のプログラムでも、WSH でも Java でも Access でも Excel でも。 
 
私は、拙作 EXP2CSV(ODBCデータソースをCSVにエクスポートするCUIツール)を使ってみる事にします。

■SQL は Jet の構文で

例として、逆引きSQL比較に書いた、 
 
・結合条件に合致しなくてもすべての行を表示させるには?
・最大値と等しいデータを検索するには? 
 
について、実装してみましょう。前者は外部結合、後者は相関サブクエリーの例です。

SQL は Jet の構文で書く必要があります。以下のようなSQLを書いたファイルを準備しました。
JetSQL は ORACLE はもちろんの事、Microsoft SQL Server ともちょっと異なる方言なので注意が必要です。 関数はユーザー定義関数以外殆ど使用可能だと思います。
これを実行してみます。
C:\>exp2csv csv "" "" . "" -q -f test1.sql
佐々木光三,2004-09-12 00:00:00,10
佐々木光三,2004-10-21 00:00:00,20
(結果中略)
種田正一,2004-10-12 00:00:00,5
種田正一,2004-11-28 00:00:00,5

C:\>exp2csv csv "" "" . "" -q -f test2.sql
2004-07-15 00:00:00,折□信子,盤古総合商事株式会社,15
2004-07-22 00:00:00,種田正一,(株)創世,5
(結果中略)
2004-10-15 00:00:00,尾崎秀雄,盤古総合商事株式会社,15
2004-10-21 00:00:00,佐々木光三,(株)王真紅,20

C:\>
どちらの場合も意図した結果を得ることができました。

■Excel の場合は…

対象が CSV や TSV などのテキストファイルではなく、Excel のブックの時は、 当然、ドライバーはExcelのドライバーを選択する必要があります。
さらに、SQL についても、構文自体は JetSQL なのですが、ちょっとクセがあります。 例えば、Sheet1 をテーブルとし、1行目を列名として、A1 を "col1" とした場合、
のように書きます。 
 
最初、この構文がわからず難儀しました(ODBC の SDK などを見れば書いてあるのか?)。 結局、ブックを Access でリンクした状態で、ODBCトレースを取って、 変換された SQL を確認しました。 …じゃ、Access があれば、このコーナーって不要じゃん。

■シュミシュミとは書いたけど

以上で、このシュミシュミなコーナーは終わりです。
私自身は、テキストの検索は殆ど grepツールを使いますが、  
 
『grep?正規表現?何それ?でも JetSQL だったらメッチャ得意!』
 
と言う方には、お薦めします。特に、 
 
『エクセルの複数のシートを串刺しで検索したいんだけど、エクセラーじゃないので』(<ハハ、俺の事だ)
 
何て時には使える小技ではないかと。どうでしょう?

ワークスINDEXへ