WSHサンプル集
以下、上から組み合わせて、使うこと。
必要な場合のみ、パス区切り文字が付けられるので、自分で "\" を入れるより、こちらを使うこと。
既存ファイルがある場合、デフォルトでは、上書きしない(下の例では、上書きを指定)
CSVファイルのあるディレクトリに、以下のようなファイルを用意すると、ヘッダが無くても列名を定義できる。
Schema.ini
基本テンプレート
拡張子wsfのファイルを作成する。<job id="JOBID"> <script language="JScript"> </script> </job>ファイルシステムオブジェクトを生成する。
var fs = new ActiveXObject("Scripting.FileSystemObject");スクリプトファイルのディレクトリを取得
// スクリプトファイルのディレクトリ var dir = fs.GetParentFolderName(WSH.ScriptFullName);フォルダ名とファイル名からパスを組み立てる
必要な場合のみ、パス区切り文字が付けられるので、自分で "\" を入れるより、こちらを使うこと。
var path_in = fs.BuildPath(dir, "input.txt"); var path_out = fs.BuildPath(dir, "output.txt");
テキストファイルの読み書き
ファイルの文字コードは、基本的にASCII(Shift_JIS)になり、Unicodeを指定すると、UTF-16になるようだ。読み込み
var fin = fs.OpenTextFile(path_in); while (!fin.AtEndOfStream) { var s = fin.ReadLine(); } fin.Close();読み込みメソッド
var s; // 文字数指定 s = fin.Read(6); // 読み込み fin.Skip(2); // 読み飛ばし // 一行 s = fin.ReadLine(); // 読み込み fin.SkipLine(); // 読み飛ばし // 一括読み込み s = fin.ReadAll();
書き込み
ファイルを新規作成して、書き込む場合既存ファイルがある場合、デフォルトでは、上書きしない(下の例では、上書きを指定)
var fs = new ActiveXObject("Scripting.FileSystemObject"); // 引数 (path[, true:overwrite[, true:unicode]) var fout = fs.CreateTextFile(path_out, true); fout.WriteLine("Hello, WSH!"); fout.Close();
既存ファイルへの上書き書き込みの場合
ファイルが無い場合、デフォルトでは新規作成しない(下の例では、作成を指定)
var fs = new ActiveXObject("Scripting.FileSystemObject"); var ForReading = 1, ForWriting= 2, ForAppending = 8; // 引数 (path, io_mode, create) var fout = fs.OpenTextFile(path_out, ForWriting, true); fout.WriteLine("Hello, WSH!"); fout.Close();
CreateTextFileを使用するか、OpenTextFileを使用するかは、以下の場合を除き、どちらでも良さそう。
- 追加書き込みしたい → OpenTextFile の第2引数に ForAppending を指定
- ファイルが無ければ、新規作成したい → CreateTextFile で第2引数に false を指定(省略可)
- ファイルが無ければ、新規作成したくない → OpenTexFile の第3引数に false を指定(省略可)
fout.WriteLine("Hello"); // 改行付き fout.Write("World!"); // 改行なし fout.WriteBlankLines(2); // 改行を2つ
CSVファイルの読み込み
以下のような、CSVファイル(address.csv)を読み込む場合
name,age,address "田中",20,"大阪府" "鈴木",24,"東京都" "佐藤",22,"北海道"
ADOを使用する。テーブル名にファイル名を("."を"#"にして)指定して、SQL文を実行できる。
var csv_dir = "C:\\csv"; var con = new ActiveXObject("ADODB.Connection"); con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + csv_dir + ";" + "Extended Properties=\"text;HDR=YES;FMT=Delimited;\";"; con.Open(); // CSVファイルから、SQLでクエリ var rs = con.Execute("select * from address#csv order by age"); while (!rs.EOF) { var name = rs.Fields("name"); var age = rs.Fields("age"); rs.MoveNext(); } rs.Close(); con.Close();CSVファイルの一行目にヘッダが無い場合、接続文字列で、"HDR=NO" を指定する。
var csv_dir = "C:\\csv"; var con = new ActiveXObject("ADODB.Connection"); con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + csv_dir + ";" + "Extended Properties=\"text;HDR=NO;FMT=Delimited;\";"; con.Open(); // CSVファイルから、SQLでクエリ var rs = con.Execute("select * from address#csv"); while (!rs.EOF) { var name = rs.Fields(0); var age = rs.Fields(1); rs.MoveNext(); } rs.Close(); con.Close();他のSQLを実行したところ、INSERTを使用できたが、UPDATEとDELETEは、使用できなかった。
CSVファイルのあるディレクトリに、以下のようなファイルを用意すると、ヘッダが無くても列名を定義できる。
Schema.ini
[address.csv]
ColNameHeader=False
Format=CSVDelimited
CharacterSet=OEM
Col1=name Text
Col2=age Byte
Col3=address Text
詳細は、MSDNを参照。タブ区切り文字、固定文字数での区切り、任意文字での区切りなどに対応できるみたい。