ワークス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 は Jet の構文で
例として、
逆引きSQL比較に書いた、
・結合条件に合致しなくてもすべての行を表示させるには?
・最大値と等しいデータを検索するには?
について、実装してみましょう。前者は外部結合、後者は相関サブクエリーの例です。
SQL は Jet の構文で書く必要があります。以下のようなSQLを書いたファイルを準備しました。
JetSQL は ORACLE はもちろんの事、Microsoft SQL Server ともちょっと異なる方言なので注意が必要です。
関数はユーザー定義関数以外殆ど使用可能だと思います。
test1.sql(結合条件に合致しなくてもすべての行を表示させるには?)
select e.empnm as "スタッフ名", s.saledt as "販売日" , s.qty as "販売数量"
from kemp.csv as e left join ksale.csv as s on e.empno = s.empno
where e.job = 'スタッフ'
order by e.empno,s.saledt
test2.sql(最大値と等しいデータを検索するには?)
select s.saledt as "販売日",e.empnm as "スタッフ名",
c.custnm as "顧客名",s.qty as "販売数量"
from ksale.csv as s, kemp.csv as e, kcust.csv as c
where s.empno = e.empno
and s.custno = c.custno
and exists
(select custno,max(qty) from ksale.csv
where custno = s.custno
group by custno
having max(qty)= s.qty
)
order by s.saledt,e.empnm
これを実行してみます。
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" とした場合、
select `Sheet1$`.`col1` from `Sheet1$`
のように書きます。
最初、この構文がわからず難儀しました(ODBC の SDK などを見れば書いてあるのか?)。
結局、ブックを Access でリンクした状態で、ODBCトレースを取って、
変換された SQL を確認しました。
…じゃ、Access があれば、このコーナーって不要じゃん。
■シュミシュミとは書いたけど
以上で、このシュミシュミなコーナーは終わりです。
私自身は、テキストの検索は殆ど grepツールを使いますが、
『grep?正規表現?何それ?でも JetSQL だったらメッチャ得意!』
と言う方には、お薦めします。特に、
『エクセルの複数のシートを串刺しで検索したいんだけど、エクセラーじゃないので』(<ハハ、俺の事だ)
何て時には使える小技ではないかと。どうでしょう?
ワークスINDEXへ