csvselect by kanegon 1. 概要 CSV ファイルを DB のテーブルに見たたて SQL の select 文で検索します。 2. 環境 以下の環境で確認しています。 その他の環境でも動作すると思いますが、確認できていません。 Windows XP SP3 Windows 7 JScript と ADO が動作すればよいので、Win 2000 以上なら動作する可能性はありま す。というか、以前は Win2K でも確認していましたが、環境がなくなったので。 3. ファイル構成 readme.txt このファイル csvselect.js コマンド本体 ファイルを展開するだけで特別なインストール作業は必要ありません。 実際の使い方は 6.使用例 を参照してください。 4. 特徴 CSV ファイルを検索する方法はいくつかあります。 Microsoft が提供している logparser などのツールを使ったり、ADO の Text Driver を使う簡単なスクリプトを記述したりすることでも可能です。 しかし、前者のツールは SQL のサブセットしかサポートしておらず、テーブルの結 合などもできません。 後者の方法はプログラムを記述しなければならないうえ、データ型が自動認識となっ てしまうため、適切な型として認識されない可能性があります。型を指定する方法は ありますが、専用の定義ファイルを作成しなければならず面倒です。 当ツールは内部では後者の方法を利用しますが、面倒な作業をツール内部で隠蔽しま す。型情報についてもコマンドラインの引数として直接指定可能とすることで簡単な 操作性を実現します。 5. コマンド書式 csvselect.js -sql [-file [-file ] ...] [-debug] [-useschema] [-shownull] [-noheader] [-showseparator] -sql sql の select 文を記述します。 from 句は csv ファイル名を指定します。 各ファイルには必ず alias の指定が必要です。 -file csv ファイルの属性を指定します。csv ファイルの数だけ 指定が必要です。 書式は以下の形式です。 ='header={true|false}; types=([,...]); names=([,...]); delimiter={csv|tab|sp|fix}' -debug デバッグモードで実行します。 一時ファイルを削除しません。 -useschema -debug で生成した一時ファイルを利用して実行ます。 -shownull NULL データを "" と表記します。 -noheader ヘッダ行の出力を抑止します。 -showseparator ヘッダ行とデータの間にセパレータを表示します。 header は CSV ファイルの先頭行をヘッダ行とみなすか否かを指定します。 types ではカラム毎の型の情報を text, integer などと指定します。 names ではカラム毎のヘッダ名を指定します。指定が省略された場合、ヘッダ名は F1,F2,... となります。 delimiter はカラムの区切り記号を指定します。デフォルトはカンマ区切りです。 (csv:カンマ区切り、tab:タブ区切り、sp:空白区切り、fix:固定長) 最低限、必須なものは -sql パラメタのみです。 属性(-file オプション)を指定しない場合、以下の動作となります。 - csv ファイルにヘッダ行があるものとみなします。 そのため、csv ファイルの1 行目はデータの有効行とはみなされません。 - カラム名はヘッダ行(csv ファイルの 1 行目)から取得します。 - すべてのカラムは文字列型と解釈します。 6. 使用例 6.1 使用例その1 同じフォルダ内に csvselect.js、a.csv、b.csv があるものとします。 a.csv、b.csv の内容は以下とします。 a.csv ----------------------------------- 品名,単価 パソコン,50000 テレビ,15000 ----------------------------------- b.csv ----------------------------------- 品名,所有台数 パソコン,1 テレビ,3 ----------------------------------- この状態でコマンドプロンプトで該当のフォルダに移動してから以下のコマンドを入 力します。 > cscript //nologo csvselect.js -sql "select a.品名,a.単価*b.所有台数 as 合計金額 from [[a.csv as a]],[[b.csv as b]] where a.品名 = b.品名" -file "a='header=true;types=(text,integer)'" -file "b='header=true;types=(text,integer)'" 以下の結果が表示されます。 出力結果 ----------------------------------- 品名,合計金額 パソコン,50000 テレビ,45000 ----------------------------------- sql 文中に csv ファイル名をテーブル名の代わりとして指定します。 ただし、csv ファイル名の指定箇所は必ず [[ ]] で囲むこと、また、as 句による alias (別名)指定を必ず行うよう、注意してください。 6.2 使用例その2 使用例その1では、数値での演算が必要なため -file オプションの指定が必要でした。 すべてのカラムを文字列で扱ってかまわない場合、-file オプションは省略できます。 -file オプションで明示的に型を指定しない場合、すべてのカラムは文字列と解釈さ れます。 c.csv ----------------------------------- 品名,型番,出荷 パソコン,PC-01,0 パソコン,PC-02,0 パソコン,PC-10,1 パソコン,PC-01,0 パソコン,PC-01,0 テレビ,TV-01,0 テレビ,TV-03,1 テレビ,TV-01,0 ----------------------------------- c.csv の内容を上記とします。 商品の品名、型番、出荷情報(出荷済の商品に'1')が記載されているものとします。 この csv から未出荷商品の一覧と出荷残数を出力してみます。 > cscript //nologo csvselect.js -sql "select 品名,型番,COUNT(型番) AS 出荷残数 from [[c.csv as c]] where 出荷='0' group by 品名,型番" 出力結果 ----------------------------------- 品名,型番,出荷残数 テレビ,TV-01,2 パソコン,PC-01,3 パソコン,PC-02,1 ----------------------------------- この例の場合、sql 文のみ記述が必要で、-file オプションは必要ありません。 6.3 使用例その3 固定長のファイルを処理する例を示します。 以下の d.csv から、未出荷の商品を表示してみます。 d.csv ----------------------------------- 品名 型番 出荷 パソコン PC-01 0 パソコン PC-02 1 テレビ TV-01 0 ----------------------------------- > cscript //nologo csvselect.js -debug -sql "select 品名,型番,count(型番) as 出荷残数 from [[d.csv as d]] where 出荷=0 group by 品名,型番" -file "d='names=(品名,型番,出荷);types=(text width 10,text width 10,integer width 10);delimiter=fix'" 次の結果が得られます。 出力結果 ----------------------------------- 品名,型番,出荷残数 テレビ,TV-01,1 パソコン,PC-01,1 ----------------------------------- 7. useschema オプションについて csvselect は内部的に ADO の Text Driver を利用します。 Text Driver では schema.ini を使用することで、列の型やサイズなどを指定できま すが、csvselect では、指定されたパラメタから内部的に schema.ini を生成して列 の名前や型を制御します。 しかし、csvselect のオプションでは、schema.ini のすべてのパラメタを指定できる わけではありません。 -useschema オプションは複雑な schema ファイルを利用したい場合に使用する方法 です。 利用方法は、以下となります。 1) -debug で .\tempdir\schema.ini を生成する 2) 生成された shema.ini を編集する 3) -useschema オプションを指定して、csvselect コマンドを実行する この際には、-debug オプション、-file オプションともに不要です。 8. 注意点 - 謎のエラーが表示される 表示されるエラーが分かりにくい場合があります。 たとえば、以下のようなエラー。 [ERROR] 3600 :[Microsoft][ODBC テキスト Driver] パラメータが少なすぎます。1 を指定してください。 以下に例を示します。 正) C:\work> cscript csvselect.js -sql "select a.品名 from [[a.csv as a]]" 誤) C:\work> cscript csvselect.js -sql "select a.商品名 from [[a.csv as a]]" この例では「品名」と記述すべきところ、「商品名」と存在しないカラム名を誤って記 述しました。その結果、上記エラーが表示されます。 他にも分かりにくいエラーがありますが、これは OS 標準添付のドライバの出力するメッ セージであり、アプリ側での対処は困難です。 意味不明のエラーが表示された場合、当アプリの問題である場合や、複雑な SQL であ るために解釈しきれない、などといった問題の可能性もありますが、単純な誤記の場合 も多いので、エラーとなった場合、あきらめずに SQL 文の内容を十分に見直してみる ことをお勧めします。 9. 使用条件 本プログラムおよびソースコードは自由に使用することができます。 本プログラムおよびソースコードの配布や改変に制限はなく、商用利用も可能としま す。改変した生産物に著作権表示も不要です。 本プログラムおよびソースコードは無保証です。 本プログラムおよびソースコードの使用において生じた如何なる損害についても作者 は一切の責任を負いません。 10. 修正履歴 ver0.01 2005.09.11 新規作成 ver0.02 2005.09.12 オプション誤りのエラーメッセージを追加 ver0.03 2011.07.05 使用できる sql 文の制限を大幅に緩和 オプションの書式指定を変更 ver0.04 2011.07.31 区切り文字の指定、schema.ini の編集を可能に 11. 連絡先 金子尚史(kanegon) e-mail: wbs01621@mail.wbs.ne.jp