JavaScript(WSH)
スクリプトでファイル入出力
Programming TIPs編その15「JavaScriptを使ってExcelファイルからCSVを作る」で触れたJavaScript(WSH)ですが、この人中々にして面白くて奥が深い。そしてゲーム製作の裏方さんとしてかなりに強力。なので、備忘録に付けて行くことにしました。細かい技術が色々あり、知れば知るほど助けになる。そんなスクリプトみたいです(^-^)
@ ファイルに文字を出力
手始めはファイルを作って、開いて、そこに文字を書き込むという一連の作業をしてみます。これが出来れば色々な中間データの生成に役立ちます。
JavaScript内でWSHを使ってファイルを扱うには「Scripting.FileSystemObject」というオブジェクトを作ります:
var fs = WScript.CreateObject("Scripting.FileSystemObject");
この人がファイル操作を担当してくれます。
FileSystemObjectから新規のテキストファイルを作ってみます:
var file = fs.CreateTextFile("text.txt");
FileSystemObject.CreateTextFileメソッドの第1引数にファイル名を与えると新しいテキストファイルがさくっとできます。ちなみに、戻り値の型はTextStreamクラスです。このファイルに文字を書き込むには、
file.Write("マルペケつくろ〜");
とWriteメソッドを呼び出します。非常に簡単です。開いたファイルは必ず閉じます:
file.Close();
基本はこれだけ。異常に簡単です。
A 既存のファイルを開いて書き込み
既存のファイルを開くにはFileSystemObject.OpenTextFileメソッドを用います:
var file = fs.OpenTextFile("text.txt", 2);
第1引数には開きたいテキストファイル名、第2引数はオープンモードを指定します。オープンモードは以下の通りです:
モード 読み込み用 1 書き込み用 2 追加書き込み用 8
指定のファイルが無い場合、デフォルトはfalseが返ってきますが、無い場合にファイルを新規に作れれば楽です。その場合は第3引数にtrueを渡します。テキストファイルをASCIIコード(JISコード)で作りたい場合には第4引数に0、UTF16(いわゆるUNICODE)で作りたい時には-1を与えます。文字コードはゲームプログラムでは重要なのでちゃんとした方が良いですね。ファイルが無い場合に新規にUNICODEでテキストファイルを開きたい場合は次の通りです:
var file = fs.OpenTextFile("text.txt", 2, true, -1);
開いた後の書き込みは同じです。
B ファイルから読み込み
既存のファイルから情報を読み込むには上のオープンモードよ読み込み用にするだけです。読み込みは常に読み込み先にどのような情報があるかを予想していると思いますので、読み込みパターンを知るのが大切です。
良く使うのが1行読み込み:
var str = file.ReadLine();
呼ぶ度に1行読み込むのでとても便利です。文字数を指定して読み込むにはReadメソッドを用います:
var str = file.Read(10);
引数は読み込む文字数です。ASCIIの場合日本語とASCIIが混合しますが、ちゃんと文字数分だけ読んでくれます。例えば「あいうえお12345かきくけこ」というテキストファイルがあって、先頭から8文字読み込むと「あいうえお123」となります。
FileSystemObjectのテキストファイルの読み書きはあまり凝ったことはできません。ですから、例えばCSVを読もうと思ったら、面倒でも1文字ずつ文字を取り出してチェックをしていくしか基本的には無いかなと思います。
最後に、備忘録として、この章を検証するために作ったサンプルコードを置いておきます:
// 新規ファイル作成
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var file = fs.OpenTextFile("text.txt", 2, true, 0);
file.Write("マルペケつくろ〜だぜ!");
file.Close();
// 読み込み
var file2 = fs.OpenTextFile("text.txt", 1);
var str = file2.ReadLine();
WScript.Echo(str);
file2.Close();
// 指定文字数分だけ読み込み
var file3 = fs.OpenTextFile("text.txt", 1);
str = file3.Read(3);
WScript.Echo(str);
file2.Close();
// 文字数は日本語とASCIIを区別する?
var file4 = fs.OpenTextFile("text2.txt", 2, true, 0);
file4.Write("あいうえお12345かきくけこ");
file4.Close();
var file5 = fs.OpenTextFile("text2.txt", 1);
str = file5.Read(7);
WScript.Echo(str);
file5.Close();