2009年07月10日 Java儂(わし)的解釈によるメモ(JDBC + MySQL編)
_ Java儂(わし)的解釈によるメモ(JDBC + MySQL編)
JavaからDBMS(MySQL)にJDBC経由で接続してみる。例によって用語、用法等は思い込みである部分が見受けられると思うが、御容赦願う。
準備
Slackware-12.xに標準でインストールされるMySQL-5.xをそのまま利用する。
JDBCドライバの取得
mysql-connector-java-5.0.8.tar.gzを取得(http://dev.mysql.com/downloads/connector/j/)
$ tar xvzf mysql-connector-java-5.0.8.tar.gz $ cp mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar .
mysql-connector-java-5.0.8-bin.jarをどこかグローバルな場所(例えば/usr/local/jdk/みたいな)に置いて、
CLASSPATH=${CLASSPATH}:/usr/local/jdk/mysql-connector-java-5.0.8-bin.jar; export CLASSPATH
しておくのも良いかも。
データベース領域の初期化
mysqldを起動するに当たって、一度だけ実行する必要がある。
# mysql_install_db --user=mysql
mysqld起動スクリプトの修正
JDBC経由でアクセスするために起動オプションを修正する(/etc/rc.d/rc.mysqld)。
#SKIP="--skip-networking" <-- コメントアウト
MySQLコンフィグファイル設定
デフォルト文字コード、デフォルトストレージエンジンの設定。
標準のストレージエンジンであるMyISAMは速度は早いが、トランザクションがサポートされていない。非標準のストレージエンジンであるInnoDBはMyISAMに比べると速度が劣るがトランザクションをサポートする。
汎用機畑で育った私としてはトランザクションが無い(すなわちcommit、rollbackが無い)のは信じられないので、デフォルトのストレージエンジンをInnoDBに変更する。
# cp /etc/my-small.conf /etc/my.cnf # vi /etc/my.cnf [client] ##default-character-set = utf8 default-character-set = ujis
[mysqld] ##default-character-set = utf8 default-character-set = ujis default-storage-engine=innodb
mysqld起動
# chmod +x /etc/rc.d/rc.mysqld; reboot
MySQL管理者(root)のパスワード設定
# mysqladmin -u root password ROOT-PASSWORD
データベース(jdbctestdb)の作成
# mysql -u root -p Enter password: XXXXXXXXXXXXX <-- ROOT-PASSWORDを入力する mysql> create database jdbctestdb character set ujis; mysql> quit
一般ユーザ(m-ito)にデータベースへのアクセス権を設定
# mysql -u root -p jdbctestdb Enter password: XXXXXXXXXXXXX <-- ROOT-PASSWORDを入力する mysql> grant all on jdbctestdb.* to 'm-ito'@'localhost' identified by 'USER-PASSWORD'; mysql> quit
一般ユーザ用MySQLコンフィグファイル設定
パスワードの設定とデフォルト文字コードの設定。このあたりは必要に応じて...。
$ cp /etc/my-small.conf ~m-ito/.my.cnf $ chmod 600 ~m-ito/.my.cnf $ vi ~m-ito/.my.cnf [client] password = USER-PASSWORD ##default-character-set = utf8 default-character-set = ujis
サンプルプログラム
// // 「jdbc mysql」テスト // // compile : javac -encoding utf-8 jdbc_mysql.java // run : java -cp .:mysql-connector-java-5.0.8-bin.jar jdbc_mysql // //import java.sql.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; public class jdbc_mysql { static Connection conn = null; static Statement stmt = null; static PreparedStatement pstmt = null; static ResultSet rs = null; static ResultSetMetaData rsmd = null; public static void main(String[] args) { try { // // JDBC for MySQLのロード // Class.forName("com.mysql.jdbc.Driver").newInstance(); System.out.println("JDBCドライバをロードしました。"); // // データベースへの接続 // // String url = "jdbc:mysql://localhost/jdbctestdb?useUnicode=true&characterEncoding=SJIS"; String url = "jdbc:mysql://localhost/jdbctestdb?useUnicode=true&characterEncoding=EUC_JP"; conn = DriverManager.getConnection(url, "m-ito", "USER-PASSWORD"); System.out.println("jdbctestdbに接続しました。"); // // 自動コミット停止(トランザクションの開始) // conn.setAutoCommit(false); System.out.println("自動コミットをOFFにしました。"); // // SQLステートメントオブジェクト生成 // stmt = conn.createStatement(); // // テーブルの削除 // try { stmt.executeUpdate("drop table member"); System.out.println("テーブル member を削除しました。"); } catch(Exception e){ System.out.println("テーブル member を削除できませんでした(" + e.getMessage() + ")"); } // // テーブルの作成 // stmt.executeUpdate( "create table member (" + "id INT PRIMARY KEY," + "name VARCHAR(50)," + "job VARCHAR(50)" + ") engine = innodb" ); System.out.println("テーブル member を作成しました。"); // // わざと2重にテーブル作成してみる // try { stmt.executeUpdate( "create table member (" + "id INT PRIMARY KEY," + "name VARCHAR(50)," + "job VARCHAR(50)" + ")" ); System.out.println("テーブル member を作成しました(2)。"); } catch(Exception e){ System.out.println("テーブル member を作成できませんでした(2)(" + e.getMessage() + ")"); } // // 2次インデックス作成 // stmt.executeUpdate("create index i_member_name on member(name)"); System.out.println("インデックスを作成しました。"); // // タプルの追加 // try { pstmt = conn.prepareStatement("insert into member (id, name, job) values (?, ?, ?)"); // // 1件目 // pstmt.setInt(1, 1); pstmt.setString(2, "伊藤 太郎"); pstmt.setString(3, "サラリーマン"); pstmt.executeUpdate(); System.out.println("インサートしました。"); // // 2件目 // pstmt.setInt(1, 2); pstmt.setString(2, "山田 太郎"); pstmt.setString(3, "野球選手"); pstmt.executeUpdate(); System.out.println("インサートしました。"); // // 3件目 // pstmt.setInt(1, 3); pstmt.setString(2, "山田 花子"); pstmt.setString(3, "タレント"); pstmt.executeUpdate(); System.out.println("インサートしました。"); // // わざと3件目をもう一度追加してみる // pstmt.setInt(1, 3); pstmt.setString(2, "山田 花子"); pstmt.setString(3, "タレント"); pstmt.executeUpdate(); System.out.println("インサートしました。"); } catch (Exception e) { System.out.println("インサートできませんでした(" + e.getMessage() + ")"); } // // タプルの検索 // try { // // クエリの実行 // pstmt = conn.prepareStatement("select * from member where id >= ?"); pstmt.setInt(1, 1); rs = pstmt.executeQuery(); // // 1件目の取り出し // rs.next(); System.out.println("セレクトしました(id=" + rs.getInt("id") + ")(name=" + rs.getString("name") + ")(job=" + rs.getString("job") + ")。"); // // 2件目の取り出し // rs.next(); System.out.println("セレクトしました(id=" + rs.getInt("id") + ")(name=" + rs.getString("name") + ")(job=" + rs.getString("job") + ")。"); // // 3件目の取り出し // rs.next(); System.out.println("セレクトしました(id=" + rs.getInt("id") + ")(name=" + rs.getString("name") + ")(job=" + rs.getString("job") + ")。"); // // わざと存在しない4件目を取り出してみる // rs.next(); System.out.println("セレクトしました(id=" + rs.getInt("id") + ")(name=" + rs.getString("name") + ")(job=" + rs.getString("job") + ")。"); } catch (Exception e) { System.out.println("セレクトできませんでした(" + e.getMessage() + ")"); } // // タプルの更新 // try { // // 更新ステートメント実行 // pstmt = conn.prepareStatement("update member set job = ? where name = ?"); pstmt.setString(1, "裁判官"); pstmt.setString(2, "山田 太郎"); pstmt.executeUpdate(); System.out.println("アップデートしました。"); // // 更新結果を取り出すクエリの実行 // pstmt = conn.prepareStatement("select * from member where name = ?"); pstmt.setString(1, "山田 太郎"); rs = pstmt.executeQuery(); // // クエリ結果の取り出し // rs.next(); System.out.println("アップデート結果(id=" + rs.getInt("id") + ")(name=" + rs.getString("name") + ")(job=" + rs.getString("job") + ")。"); } catch (Exception e) { System.out.println("アップデートできませんでした(" + e.getMessage() + ")"); } // // タプルの削除 // try { // // 削除ステートメント実行 // pstmt = conn.prepareStatement("delete from member where name like ?"); pstmt.setString(1, "山田%"); pstmt.executeUpdate(); System.out.println("デリートしました(" + pstmt.getUpdateCount() + "件)。"); // // 削除後の状態の検索クエリ実行 // pstmt = conn.prepareStatement("select * from member"); rs = pstmt.executeQuery(); // // クエリ結果の取り出し // while (rs.next()){ System.out.println("デリート結果(id=" + rs.getInt("id") + ")(name=" + rs.getString("name") + ")(job=" + rs.getString("job") + ")。"); } } catch (Exception e) { System.out.println("デリートできませんでした(" + e.getMessage() + ")"); } // // メタデータの取得 // try { // // メタデータの取得 // rsmd = rs.getMetaData(); // // カラム数の取得 // int numberOfColumns = rsmd.getColumnCount(); System.out.print("メタデータを取得しました("); for (int i = 1; i <= numberOfColumns; i++) { // // カラム名称の取得 // String name = rsmd.getColumnName (i); System.out.print(name + "\t"); } System.out.println(")。"); } catch (Exception e) { System.out.println("メタデータを取得できませんでした(" + e.getMessage() + ")"); } // // コミット(トランザクションの反映) // try { conn.commit(); System.out.println("コミットしました。"); } catch (Exception e) { System.out.println("コミットできませんでした(" + e.getMessage() + ")"); } } catch (SQLException e) { System.out.println("SQLException: " + e.getMessage()); System.out.println("SQLState: " + e.getSQLState()); System.out.println("VendorError: " + e.getErrorCode()); // // ロールバック(トランザクションの破棄) // try { conn.rollback(); } catch(Exception e2){ System.out.println(e2.getMessage()); } } catch(Exception e){ System.out.println(e.getMessage()); // // ロールバック(トランザクションの破棄) // try { conn.rollback(); } catch(Exception e2){ System.out.println(e2.getMessage()); } } try { // // 検索クエリの結果セットオブジェクトを破棄 // rs.close(); // // SQLステートメントオブジェクトを破棄 // stmt.close(); pstmt.close(); // // データベースからの切断 // conn.close(); } catch(Exception e){ System.out.println(e.getMessage()); } System.out.println("jdbctestdbから切断しました。"); } }
実行結果
JDBCドライバをロードしました。 jdbctestdbに接続しました。 自動コミットをOFFにしました。 テーブル member を削除しました。 テーブル member を作成しました。 テーブル member を作成できませんでした(2)(Table 'member' already exists) インデックスを作成しました。 インサートしました。 インサートしました。 インサートしました。 インサートできませんでした(Duplicate entry '3' for key 1) セレクトしました(id=1)(name=伊藤 太郎)(job=サラリーマン)。 セレクトしました(id=2)(name=山田 太郎)(job=野球選手)。 セレクトしました(id=3)(name=山田 花子)(job=タレント)。 セレクトできませんでした(After end of result set) アップデートしました。 アップデート結果(id=2)(name=山田 太郎)(job=裁判官)。 デリートしました(2件)。 デリート結果(id=1)(name=伊藤 太郎)(job=サラリーマン)。 メタデータを取得しました(id name job )。 コミットしました。 jdbctestdbから切断しました。
追記
- stmt.executeUpdate(INSERT|DELETE|UPDATE) の戻り値は更新されたタプル数
- stmt.executeUpdate(上記以外の更新系SQL) の戻り値は 0
- エラー発生時は SQLExceptin 発生。getSQLState()にてエラーコードを取得できる。
about Microsoft SQL Server(情報のみ)
Microsoft SQL Server 2005 JDBC Driver
JDBCドライバ(msbase.jar、mssqlserver.jar)を使用した場合(SQLServer2000以前)
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://サーバ名:1433","ユーザID","パスワード");
JDBCドライバ(sqljdbc.jar)を使用した場合(SQLServer2005以降)
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection con = DriverManager.getConnection("jdbc:sqlserver://サーバ名:1433","ユーザID","パスワード");
about Oracle(情報のみ)
Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection("jdbc:oracle:thin:@サーバ名:1521:OracleSID","ユーザID","パスワード");
OracleSID : tnsnames.ora に記述がある。
2010年07月10日 java言語のインターフェースの存在意義について
_ コーディング規約の強制を実現する
あるシステム開発現場では、作成される各クラス毎に、必ず実装する必要の有る共通メソッド(methA,methB,methC)が定められていたとする。
その場合、上記のメソッド(methA,methB,methC)をインターフェースとして宣言する。
interface Zettai_iru { void methA(); int methB(); String methC(); }
こんな感じ。
で、それぞれの開発者がクラスを設計する際には、必ず上記のインターフェース(Zettai_iru)をインプリメントする事をルールとして徹底することで、コンパイルエラーという形でメソッド(methA,methB,methC)の実装もれが未然に検知できる。
Class Hoge implements Zettai_iru { public void methA() { ... } public int methB() { ... } }
上記のクラス定義(Hoge)はmethCが実装されていないのでコンパイル時にエラーとなる。
_ メソッドの1つの引数に、実質的に複数の型(クラス)を渡すことができる
あるクラス(Boo)があって、
Class Boo { void meth_nanda() { ... } int meth_kanda() { ... } String meth_hoge() { ... } }
それが別のクラス(Foo)のメソッド(meth)の引数になっていて、methの内部ではクラスBooのメソッドの内、meth_nandaとmeth_kandaを利用したコーディングが行われているとする。
class Foo { void meth(Boo boo) { boo.meth_nanda()を使ったなんらかの処理; boo.meth_kanda()を使ったなんらかの処理; } }
メインでは以下のように呼ばれるだろう。
Class Main { public static void main(String [] args) { Foo foo = new Foo(); Boo boo = new Boo(); foo.meth(boo); } }
ここまでは、特に問題は無い。よく有る光景だと思う。
が、もしここでクラスBooによく似た別のクラス(Bar)についてもクラスFooのメソッドmethで処理したい要件が発生したとする。
クラスBarはクラスBooとよく似ているのでメソッドmeth_nanda,meth_kanda,meth_hogeは実装されている。しかし、クラスFooのメソッドmethの引数の型はBoo型と定義されているので、Bar型のオブジェクトを引数として渡すことはできない。
よって、これを解決するために、クラスFooの中にBar型のオブジェクトを引数としてメソッドmethと同様の処理を行う別のメソッド(meth_for_bar)を定義した。
class Foo { void meth(Boo boo) { boo.meth_nanda()を使ったなんらかの処理; boo.meth_kanda()を使ったなんらかの処理; } void meth_for_bar(Bar bar) { bar.meth_nanda()を使ったなんらかの処理; bar.meth_kanda()を使ったなんらかの処理; } }
これで一件落着...本当に?
ここで、クラスFooのメソッドmethとmeth_for_barは引数の型が異なるだけで、ロジックそのものはほとんどコピペされている。
今後、さらにBoo似のクラスが出て来たら同様の手法でmeth_for_xxxがどんどん増えていってしまいそうである。
また、メソッドmethの仕様変更が発生した場合にはそれぞれのmeth_for_xxx達にも同じ修正を繰り返し施す必要が出てくるのは間違い無い。
これは是非避けたい
そこでインタフェースの登場となる。
クラスFooのメソッドmeth(,meth_for_bar)の引数となるクラスで定義されたメソッドの内、メソッドmeth(,meth_for_bar)内で利用されるメソッド(meth_nanda,meth_kanda)をまとめてインタフェースとして宣言する。
interface Koreha_iru { void meth_nanda(); int meth_kanda(); }
クラスBoo,BarではインターフェースKoreha_iruをインプリメントする。
Class Boo implements Koreha_iru { public void meth_nanda() { ... } public int meth_kanda() { ... } String meth_hoge() { ... } }
Class Bar implements Koreha_iru { public void meth_nanda() { ... } public int meth_kanda() { ... } String meth_hoge() { ... } }
クラスFooのメソッドmethの引数をインターフェース(Koreha_iru)型とする。
class Foo { void meth(Koreha_iru ki) { ki.meth_nanda()を使ったなんらかの処理; ki.meth_kanda()を使ったなんらかの処理; } }
すると、メインでは以下のように呼び出すことができる。
Class Main { public static void main(String [] args) { Foo foo = new Foo(); Koreha_iru boo = new Boo(); foo.meth(boo); Koreha_iru bar = new Bar(); foo.meth(bar); } }
このように、実質的にクラスFooのメソッドmethでBoo型、Bar型両方のオブジェクトを引数として処理できることとなり、冗長なメソッドmeth_for_barは必要無くなる。
_ ある意味では多重継承
クラスはインターフェースをインプリメントすることによって、インターフェースで宣言されたメソッドの実装を強制される(実装しないとコンパイルエラーになる)。
これは見方を変えれば、あるメソッドを持つという性質のみ(これらはインターフェースで宣言されたもの)を継承していると言える。
また、クラスは複数のインターフェースをインプリメント出来るので、上述の「あるメソッドを持つという性質のみ」に関して言えば多重継承出来るのだとの解釈も大きく外れてはいないかもしれない。
2013年07月10日 How to fix about blackout of XIM input mode indicator([あ]) of kinput2 with gtk+-2.24.x
_ How to fix about blackout of XIM input mode indicator([あ]) of kinput2 with gtk+-2.24.x
I re-built buggy im-xim.so :P
$ tar xvvf gtk+-2.24.10.tar.xz $ cd gtk+-2.24.10/ $ patch <../gtk+-2.24.10.diff
gtk+-2.24.10.diff
*** modules/input/gtkimcontextxim.c.ORG 2013-07-10 14:19:05.820082738 +0900 --- modules/input/gtkimcontextxim.c 2013-07-10 14:20:01.192120239 +0900 *************** *** 1776,1791 **** cr = gdk_cairo_create (widget->window); ! gdk_cairo_set_source_color (cr, &widget->style->base[GTK_STATE_NORMAL]); cairo_rectangle (cr, 0, 0, widget->allocation.width, widget->allocation.height); cairo_fill (cr); ! gdk_cairo_set_source_color (cr, &widget->style->text[GTK_STATE_NORMAL]); cairo_rectangle (cr, ! 0, 0, ! widget->allocation.width - 1, widget->allocation.height - 1); cairo_fill (cr); return FALSE; --- 1776,1791 ---- cr = gdk_cairo_create (widget->window); ! gdk_cairo_set_source_color (cr, &widget->style->text[GTK_STATE_NORMAL]); cairo_rectangle (cr, 0, 0, widget->allocation.width, widget->allocation.height); cairo_fill (cr); ! gdk_cairo_set_source_color (cr, &widget->style->base[GTK_STATE_NORMAL]); cairo_rectangle (cr, ! 0 + 1, 0 + 1, ! widget->allocation.width - 1 - 1, widget->allocation.height - 1 - 1); cairo_fill (cr); return FALSE;
Let's config & build!
$ ./configure \ --prefix=/usr \ --sysconfdir=/etc \ --mandir=/usr/man \ --with-xinput=yes \ --enable-xkb \ --enable-introspection $ make
Don't care following error :P
Using catalogs: /etc/sgml/catalog Using stylesheet: /usr/share/sgml/docbook/utils-0.6.14/docbook-utils.dsl#html Working on: /home/m-ito/tmp/gtk+-2.24.10/docs/tutorial/gtk-tut.sgml mv: cannot stat 'gtk-tut': No such file or directory mkdir: cannot create directory 'html/images': No such file or directory cp: target 'html/images' is not a directory make[3]: *** [html] Error 1 make[3]: Leaving directory `/home/m-ito/tmp/gtk+-2.24.10/docs/tutorial' make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory `/home/m-ito/tmp/gtk+-2.24.10/docs' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/home/m-ito/tmp/gtk+-2.24.10' make: *** [all] Error 2
Updated /usr/lib/gtk-2.0/2.10.0/immodules/im-xim.so
# cp /usr/lib/gtk-2.0/2.10.0/immodules/im-xim.so /usr/lib/gtk-2.0/2.10.0/immodules/im-xim.so.ORG # install -s modules/input/.libs/im-xim.so /usr/lib/gtk-2.0/2.10.0/immodules/ # ldconfig
and everything gose fine :D
2015年07月10日 My tools of vbscript
_ My tools of vbscript
mytoolkit.vbs
Option Explicit ''================================================== '' '' 標準入出力クラス '' Class MyStdio Dim objStdin Dim objStdout Dim objStderr Dim bReadSuccess Sub Class_initialize() Set objStdin = WScript.StdIn Set objStdout = WScript.StdOut Set objStderr = WScript.StdErr bReadSuccess = false End Sub ' ' 機 能:標準入力より1行取得 ' 戻り値:レコード ' 例 :strRec = MyStdio.readLine ' Function readLine() If objStdin.AtEndOfStream Then readLine = "" bReadSuccess = false Else On Error Resume Next readLine = objStdin.ReadLine() If Err.Number = 0 Then bReadSuccess = true Else bReadSuccess = false End If On Error Goto 0 End If End Function ' ' 機 能:標準入力より指定文字数分取得 ' 引 数:count 取得する文字数 ' 戻り値:文字列 ' 例 :strRec = MyStdio.read(128) ' Function read(count) If objStdin.AtEndOfStream Then read = "" bReadSuccess = false Else On Error Resume Next read = objStdin.Read(count) If Err.Number = 0 Then bReadSuccess = true Else bReadSuccess = false End If On Error Goto 0 End If End Function ' ' 機 能:標準入力読み取り成功チェック ' 戻り値:true or false ' 例 :While MyStdio.isRaedSuccess ' Function isReadSuccess() isReadSuccess = bReadSuccess End Function ' ' 機 能:標準入力読み取り失敗チェック ' 戻り値:true or false ' 例 :While Not MyStdio.isRaedFailure ' Function isReadFailure() isReadFailure = Not isReadSuccess End Function ' ' 機 能:標準出力に1行出力 ' 引 数:str レコード ' 例 :MyStdio.writeLine strRec ' Function writeLine(str) objStdout.WriteLine str End Function ' ' 機 能:標準出力に指定文字列を出力 ' 引 数:str 文字列 ' 例 :MyStdio.write strString ' Function write(str) objStdout.Write str End Function ' ' 機 能:標準エラー出力に1行出力 ' 引 数:str レコード ' 例 :MyStdio.writeErrorLine strRec ' Function writeErrorLine(str) objStderr.WriteLine str End Function ' ' 機 能:標準エラー出力に指定文字列を出力 ' 引 数:str 文字列 ' 例 :MyStdio.writeError strString ' Function writeError(str) objStderr.Write str End Function ' ' 機 能:標準入力の終端を取得 ' 戻 値:True(終端時) or False(非終端時) ' 例 :While Not isEof ' Function isEof() isEof = objStdin.AtEndOfStream End Function End Class ''================================================== '' '' 文字列クラス '' Class MyString Dim value Dim booleanHighValue Dim booleanLowValue Dim objRegex Sub Class_initialize() value = "" booleanHighValue = false booleanLowValue = false Set objRegex = CreateObject("VBScript.RegExp") End Sub ' ' 機 能:文字列を設定 ' 引 数:str 文字列 ' 例 :MyString.setValue strString ' Function setValue(str) value = CStr(str) booleanHighValue = false booleanLowValue = false End Function ' ' 機 能:文字列を取得 ' 戻 値:文字列 ' 例 :strString = MyString.getValue ' Function getValue() getValue = CStr(value) End Function ' ' 機 能:正規表現との一致を取得 ' 引 数:regex 正規表現 ' 戻 値:True(一致時) or False(不一致時) ' 例 :If MyString.isMatch("^A.*Z$") ' Function isMatch(regex) objRegex.Pattern = regex isMatch = objRegex.Test(value) End Function ' ' 機 能:正規表現に一致した部分を別の文字列に置き換えるた文字列の取得 ' 引 数:regex 正規表現 ' str 置換後の文字列 ' 戻 値:文字列 ' 例 :strString = MyString.getReplace("^A.*Z$", "A to Z") ' Function getReplace(regex, str) objRegex.Global = True objRegex.Pattern = regex getReplace = objRegex.Replace(value, str) End Function ' ' 機 能:指定した区切り文字で区切って配列で取得 ' 引 数:del 区切り文字 ' 戻 値:文字列配列 ' 例 :strArray = MyString.getSplit(",") ' Function getSplit(del) getSplit = split(value, del) End Function ' ' 機 能:文字列長を取得 ' 戻 値:文字列長 ' 例 :intLength = MyString.getLength ' Function getLength() getLength = len(value) End Function ' ' 機 能:部分文字列を取得 ' 引 数:start 開始位置(1オリジン) ' length 文字列長 ' 戻 値:文字列 ' 例 :strString = MyString.Substr(1,5) ' Function getSubstr(start, length) getSubstr = Mid(value, start, length) End Function ' ' 機 能:文字列を16進数コードに変換 ' 戻 値:文字列 ' 例 :strHexString = MyString.getHexString ' Function getHexString() Dim strChar Dim strHex Dim intLen Dim intCnt strHex = "" intLen = Len(value) For intCnt = 1 To intLen strChar = Mid(value, intCnt, 1) strHex = strHex & Hex(Asc(strChar)) Next getHexString = strHex End Function ' ' 機 能:HIGH-VALUEをセットする ' 例 :MyString.setHighValue ' Function setHighValue() booleanHighValue = true value = "" End Function ' ' 機 能:HIGH-VALUEか確認する ' 戻 値:True or False ' 例 :MyString.isHighValue ' Function isHighValue() isHighValue = booleanHighValue End Function ' ' 機 能:LOW-VALUEをセットする ' 例 :MyString.setLowValue ' Function setLowValue() booleanLowValue = true value = "" End Function ' ' 機 能:LOW-VALUEか確認する ' 戻 値:True or False ' 例 :MyString.isLowValue ' Function isLowValue() isLowValue = booleanLowValue End Function ' ' 機 能:等しいか確認する ' 戻 値:True or False ' 例 :MyString.isEqual(objString) ' Function isEqual(objString) Dim stat If isHighValue Then If objString.isHighValue Then stat = true Else stat = false End If ElseIf isLowValue Then If objString.isLowValue Then stat = true Else stat = false End If Else If objString.isHighValue or objString.isLowValue Then stat = false Else If CStr(value) = CStr(objString.getValue) Then stat = true Else stat = false End If End If End If isEqual = stat End Function ' ' 機 能:大きいか確認する ' 戻 値:True or False ' 例 :MyString.isGreater(objString) ' Function isGreater(objString) Dim stat If isHighValue Then If objString.isHighValue Then stat = false Else stat = true End If ElseIf isLowValue Then stat = false Else If objString.isHighValue Then stat = false ElseIf objString.isLowValue Then stat = True Else If CStr(value) > CStr(objString.getValue) Then stat = true Else stat = false End If End If End If isGreater = stat End Function ' ' 機 能:小さいか確認する ' 戻 値:True or False ' 例 :MyString.isLess(objString) ' Function isLess(objString) Dim stat If isEqual(objString) Then stat = false ElseIf isGreater(objString) Then stat = false Else stat = true End If isLess = stat End Function End Class ''================================================== '' '' 引数クラス '' Class MyArg Dim objArg Sub Class_initialize() Set objArg = WScript.Arguments End Sub ' ' 機 能:引数の個数を取得 ' 戻 値:引数の個数 ' 例 :intCount= MyArg.getCount ' Function getCount() getCount = objArg.Count End Function ' ' 機 能:指定した引数の取得 ' 引 数:インデックス(0オリジン) ' 戻 値:文字列 ' 例 :strArg= MyArg.getValue(0) ' Function getValue(idx) getValue = objArg(idx) End Function End Class ''================================================== '' '' FileSystemObjectクラス(Shift_JIS) '' Class MyFso Dim objFso Dim objFile Dim strFilename Dim strMode Dim bReadSuccess Sub Class_initialize() Set objFile = Nothing Set objFso = Nothing strFilename = "" strMode = "" bReadSuccess = false End Sub ' ' 機 能:FSOを開く ' 引 数:filename ファイル名 ' mode "r"(読み込み) or "w"(書き込み) ' 例 :MyFso.open "INPUT.TXT", "r" ' Function open(filename, mode) Set objFso = CreateObject("Scripting.FileSystemObject") If mode = "r" Then Set objFile = objFso.OpenTextFile(filename, 1, False) Elseif mode = "w" Then Set objFile = objFso.OpenTextFile(filename, 2, True) End If strFilename = filename strMode = mode End Function ' ' 機 能:FSOを入力モードで開く ' 引 数:filename ファイル名 ' 例 :MyFso.openInput "INPUT.TXT" ' Function openInput(filename) open filename, "r" End Function ' ' 機 能:FSOを出力モードで開く ' 引 数:filename ファイル名 ' 例 :MyFso.openOutput "OUTPUT.TXT" ' Function openOutput(filename) open filename, "w" End Function ' ' 機 能:1行取得 ' 戻り値:レコード ' 例 :strRec = MyFso.readLine ' Function readLine() If objFile.AtEndOfStream Then readLine = "" bReadSuccess = false Else On Error Resume Next readLine = objFile.ReadLine If Err.Number = 0 Then bReadSuccess = true Else bReadSuccess = false End If On Error Goto 0 End If End Function ' ' 機 能:指定文字数分取得 ' 引 数:count 取得する文字数 ' 戻り値:文字列 ' 例 :strString = MyFso.read(128) ' Function read(count) If objFile.AtEndOfStream Then read = "" bReadSuccess = false Else On Error Resume Next read = objFile.Read(count) If Err.Number = 0 Then bReadSuccess = true Else bReadSuccess = false End If On Error Goto 0 End If End Function ' ' 機 能:読み取り成功チェック ' 戻り値:true or false ' 例 :While MyFso.isReadSuccess ' Function isReadSuccess() isReadSuccess = bReadSuccess End Function ' ' 機 能:読み取り失敗チェック ' 戻り値:true or false ' 例 :While Not MyFso.isReadFailure ' Function isReadFailure() isReadFailure = Not isReadSuccess End Function ' ' 機 能:1行出力 ' 引 数:str レコード ' 例 :MyFso.writeLine strRec ' Function writeLine(str) objFile.WriteLine str End Function ' ' 機 能:指定文字列を出力 ' 引 数:str 文字列 ' 例 :MyFso.write strString ' Function write(str) objFile.Write str End Function ' ' 機 能:終端を取得 ' 戻 値:True(終端時) or False(非終端時) ' 例 :While Not MyFso.isEof ' Function isEof() isEof = objFile.AtEndOfStream End Function ' ' 機 能:FSOを閉じる ' 例 :MyFso.close ' Function close() objFile.close Set objFile = Nothing Set objFso = Nothing strFilename = "" strMode = "" End Function End Class ''================================================== '' '' ActiveX Data Objectクラス(文字コード指定可能) '' Class MyAdo Dim objStream Dim strFilename Dim strMode Dim strCharset Dim booleanBomForUtf8 Dim bReadSuccess Sub Class_initialize() Set objStream = Nothing strFilename = "" strMode = "" strCharset = "" booleanBomForUtf8 = False bReadSuccess = false End Sub ' ' 機 能:ADOを開く ' 引 数:filename ファイル名 ' mode "r"(読み込み) or "w"(書き込み) ' charset "UTF-8" or "Shift_JIS" or "ASCII" etc ' bom True(UTF-8の時BOM付きで出力) or ' False(UTF-8の時BOM無しで出力) ' 例 :MyAdo.open "INPUT.TXT", "r", "UTF-8", False ' Function open(filename, mode, charset, bom) Set objStream = CreateObject("ADODB.Stream") objStream.charset = charset objStream.type = 2 ' text objStream.open If mode = "r" Then objStream.LoadFromFile filename End If strFilename = filename strMode = mode strCharset = charset booleanBomForUtf8 = bom End Function ' ' 機 能:ADOを入力モードで開く ' 引 数:filename ファイル名 ' charset "UTF-8" or "Shift_JIS" or "ASCII" etc ' 例 :MyAdo.openInput "INPUT.TXT", "UTF-8" ' Function openInput(filename, charset) open filename, "r", charset, False End Function ' ' 機 能:ADOを出力モードで開く ' 引 数:filename ファイル名 ' charset "UTF-8" or "Shift_JIS" or "ASCII" etc ' 例 :MyAdo.openOutput "OUTPUT.TXT", "UTF-8" ' Function openOutput(filename, charset) open filename, "w", charset, False End Function ' ' 機 能:1行取得 ' 戻り値:レコード ' 例 :strRec = MyAdo.readLine ' Function readLine() If objStream.EOS Then readLine = "" bReadSuccess = false Else On Error Resume Next readLine = objStream.ReadText(-2) If Err.Number = 0 Then bReadSuccess = true Else bReadSuccess = false End If On Error Goto 0 End If End Function ' ' 機 能:読み取り成功チェック ' 戻り値:true or false ' 例 :While MyAdo.isReadSuccess ' Function isReadSuccess() isReadSuccess = bReadSuccess End Function ' ' 機 能:読み取り失敗チェック ' 戻り値:true or false ' 例 :While Not MyAdo.isReadFailure ' Function isReadFailure() isReadFailure = Not isReadSuccess End Function ' ' 機 能:1行出力 ' 引 数:str レコード ' 例 :MyAdo.writeLine strRec ' Function writeLine(record) objStream.WriteText record, 1 End Function ' ' 機 能:ADOを閉じる ' 例 :MyAdo.close ' Function close() If strMode = "w" Then If strCharset = "UTF-8" Then If booleanBomForUtf8 Then save() Else saveWithoutBom() End If Else save() End If End If objStream.close Set objStream = Nothing End Function ' ' 機 能:終端を取得 ' 戻 値:True(終端時) or False(非終端時) ' 例 :While Not MyAdo.isEof ' Function isEof() isEof = objStream.EOS End Function ' ' 機 能:保存する ' 例 :MyAdo.save ' Private Function save() objStream.SaveToFile strFilename, 2 End Function ' ' 機 能:先頭の3bytesを除いて保存する ' 例 :MyAdo.saveWithoutBom ' Private Function saveWithoutBom() objStream.Position = 0 objStream.Type = 1 objStream.Position = 3 Dim bin : bin = objStream.Read() Dim stm : Set stm = CreateObject("ADODB.Stream") stm.Type = 1 stm.Open() stm.Write(bin) stm.SaveToFile strFilename, 2 stm.Close() End Function End Class ''================================================== '' '' CSVクラス '' Class MyCsv Dim strValues Dim strNames Dim strDel Dim objStr Dim objDict Sub Class_initialize() strValues = Array() strNames = "" strDel = "," Set objStr = new MyString Set objDict = CreateObject("Scripting.Dictionary") End Sub ' ' 機 能:レコードの初期化 ' 引 数:count レコードの項目数 ' 例 :MyCsv.initRec 16 ' Function initRec(count) ReDim strValues(count - 1) End Function ' ' 機 能:レコード(区切り文字含む)を設定 ' 引 数:str 文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :MyCsv.setRec strRec ' Function setRec(str) objStr.setValue(str) strValues = objStr.getSplit(strDel) End Function ' ' 機 能:レコードを取得 ' 戻 値:レコード(区切り文字含む) ' 例 :strRec = MyCsv.getRec ' Function getRec() Dim strRec Dim i strRec = "" If UBound(strValues) >= 0 Then strRec = strValues(0) For i = 1 to UBound(strValues) strRec = strRec & strDel & strValues(i) Next End If getRec = strRec End Function ' ' 機 能:項目名レコードを設定 ' 引 数:str 文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :MyCsv.setNameRec strNameRec ' Function setNameRec(str) Dim strArray Dim i strArray = Split(str, strDel) For i = 0 to UBound(strArray) objDict.Add strArray(i), i Next strNames = strDel End Function ' ' 機 能:項目名レコードを取得 ' 戻り値:文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :strNameRec = MyCsv.getNameRec ' Function getNameRec() getNameRec = strNames End Function ' ' 機 能:区切り文字を設定 ' 引 数:del 区切り文字列 ' 例 :MyCsv.setDelimiter "," ' Function setDelimiter(del) strDel = del End Function ' ' 機 能:区切り文字を取得 ' 戻り値:文字 ' 例 :charDel = MyCsv.getDelimiter ' Function getDelimiter() getDelimiter = strDel End Function ' ' 機 能:インデックス指定で項目を取得 ' 引 数:i インデックス(0オリジン) ' 戻り値:文字列 ' 例 :strString = MyCsv.getValueByIndex(0) ' Function getValueByIndex(i) If 0 <= i And i <= UBound(strValues) Then getValueByIndex = strValues(i) Else getValueByIndex = "" End If End Function ' ' 機 能:インデックス指定で項目を設定 ' 引 数:i インデックス(0オリジン) ' value 文字列 ' 戻り値:文字列 ' 例 :MyCsv.setValueByIndex 0, "STRING" ' Function setValueByIndex(i, value) If 0 <= i And i <= UBound(strValues) Then strValues(i) = value End If End Function ' ' 機 能:最終インデックスを取得 ' 戻り値:整数(0オリジン) ' 例 :intIndex = MyCsv.getLastIndex ' Function getLastIndex() getLastIndex = UBound(strValues) End Function ' ' 機 能:項目名に対応したインデックスを取得 ' 引 数:name 項目名 ' 戻り値:整数(0オリジン) ' 例 :intIndex = MyCsv.getIndexByName("ELEMENT_01") ' Function getIndexByName(name) If objDict.Exists(name) Then getIndexByName = objDict(name) Else getIndexByName = -1 End If End Function ' ' 機 能:項目名指定で項目を取得 ' 引 数:name 項目名 ' 戻り値:文字列 ' 例 :strString = MyCsv.getValueByName("ELEMENT_01") ' Function getValueByName(name) getValueByName = getValueByIndex(getIndexByName(name)) End Function ' ' 機 能:項目名指定で項目を設定 ' 引 数:name 項目名 ' value 文字列 ' 戻り値:文字列 ' 例 :MyCsv.setValueByName "ELEMENT_01", 123 ' Function setValueByName(name, value) setValueByIndex getIndexByName(name), value End Function End Class ''================================================== '' '' 標準入出力CSVクラス '' Class MyStdioCsv Dim objStdio Dim objCsv Sub Class_initialize() Set objStdio = new MyStdio Set objCsv = new MyCsv End Sub ' ' 機 能:レコードの初期化 ' 引 数:count レコードの項目数 ' 例 :MyStdioCsv.initRec 16 ' Function initRec(count) objCsv.initRec count End Function ' ' 機 能:レコード(区切り文字含む)を設定 ' 引 数:str 文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :MyStdioCsv.setRec strRec ' Function setRec(str) objCsv.setRec str End Function ' ' 機 能:レコードを取得 ' 戻 値:レコード(区切り文字含む) ' 例 :strRec = MyStdioCsv.getRec ' Function getRec() getRec = objCsv.getRec End Function ' ' 機 能:項目名レコードを設定 ' 引 数:str 文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :MyStdioCsv.setNameRec strNameRec ' Function setNameRec(str) objCsv.setNameRec str End Function ' ' 機 能:項目名レコードを取得 ' 戻り値:文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :strNameRec = MyStdioCsv.getNameRec ' Function getNameRec() getNameRec = objCsv.getNameRec End Function ' ' 機 能:区切り文字を設定 ' 引 数:del 区切り文字列 ' 例 :MyStdioCsv.setDelimiter "," ' Function setDelimiter(del) objCsv.setDelimiter del End Function ' ' 機 能:区切り文字を取得 ' 戻り値:文字 ' 例 :charDel = MyStdioCsv.getDelimiter ' Function getDelimiter() getDelimiter = objCsv.getDelimiter End Function ' ' 機 能:インデックス指定で項目を取得 ' 引 数:i インデックス(0オリジン) ' 戻り値:文字列 ' 例 :strString = MyStdioCsv.getValueByIndex(0) ' Function getValueByIndex(i) getValueByIndex = objCsv.getValueByIndex(i) End Function ' ' 機 能:インデックス指定で項目を設定 ' 引 数:i インデックス(0オリジン) ' value 文字列 ' 戻り値:文字列 ' 例 :MyStdioCsv.setValueByIndex 0, "STRING" ' Function setValueByIndex(i, value) objCsv.setValueByIndex i, value End Function ' ' 機 能:最終インデックスを取得 ' 戻り値:整数(0オリジン) ' 例 :intIndex = MyStdioCsv.getLastIndex ' Function getLastIndex() getLastIndex = objCsv.getLastIndex End Function ' ' 機 能:項目名に対応したインデックスを取得 ' 引 数:name 項目名 ' 戻り値:整数(0オリジン) ' 例 :intIndex = MyStdioCsv.getIndexByName("ELEMENT_01") ' Function getIndexByName(name) getIndexByName = objCsv.getIndexByName(name) End Function ' ' 機 能:項目名指定で項目を取得 ' 引 数:name 項目名 ' 戻り値:文字列 ' 例 :strString = MyStdioCsv.getValueByName("ELEMENT_01") ' Function getValueByName(name) getValueByName = objCsv.getValueByName(name) End Function ' ' 機 能:項目名指定で項目を設定 ' 引 数:name 項目名 ' value 文字列 ' 戻り値:文字列 ' 例 :MyStdioCsv.setValueByName "ELEMENT_01", 123 ' Function setValueByName(name, value) objCsv.setValueByName name, value End Function ' ' 機 能:標準入力より1行CSVレコード取得を取得し、objCsvへ保存 ' 戻り値:True(読めた) or False(読めなかった) ' 例 :MyStdioCsv.readLine ' Function readLine() Dim strRec strRec = objStdio.readLine If objStdio.isReadSuccess Then objCsv.setRec strRec readLine = True Else objCsv.setRec "" readLine = False End If End Function ' ' 機 能:objCsvから標準出力に1行CSVレコード出力 ' 例 :MyStdioCsv.writeLine ' Function writeLine() objStdio.writeLine objCsv.getRec End Function ' ' 機 能:objCsvから標準エラー出力にCSVレコード出力 ' 引 数:str レコード ' 例 :MyStdioCsv.writeErrorLine ' Function writeErrorLine objStdio.writeErrorLine objCsv.getRec End Function ' ' 機 能:標準入力読み取り成功チェック ' 戻り値:true or false ' 例 :While MyStdioCsv.isRaedSuccess ' Function isReadSuccess() isReadSuccess = objStdio.isReadSuccess End Function ' ' 機 能:標準入力読み取り失敗チェック ' 戻り値:true or false ' 例 :While Not MyStdioCsv.isRaedFailure ' Function isReadFailure() isReadFailure = objStdio.isReadFailure End Function ' ' 機 能:標準入力の終端を取得 ' 戻 値:True(終端時) or False(非終端時) ' 例 :While Not MyStdioCsv.isEof ' Function isEof() isEof = objStdio.isEof End Function End Class ''================================================== '' '' FileSystemObjectCSVクラス(Shift_JIS) '' Class MyFsoCsv Dim objFso Dim objCsv Sub Class_initialize() Set objFso = new MyFso Set objCsv = new MyCsv End Sub ' ' 機 能:レコードの初期化 ' 引 数:count レコードの項目数 ' 例 :MyFsoCsv.initRec 16 ' Function initRec(count) objCsv.initRec count End Function ' ' 機 能:レコード(区切り文字含む)を設定 ' 引 数:str 文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :MyFsoCsv.setRec strRec ' Function setRec(str) objCsv.setRec str End Function ' ' 機 能:レコードを取得 ' 戻 値:レコード(区切り文字含む) ' 例 :strRec = MyFsoCsv.getRec ' Function getRec() getRec = objCsv.getRec End Function ' ' 機 能:項目名レコードを設定 ' 引 数:str 文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :MyFsoCsv.setNameRec strNameRec ' Function setNameRec(str) objCsv.setNameRec str End Function ' ' 機 能:項目名レコードを取得 ' 戻り値:文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :strNameRec = MyFsoCsv.getNameRec ' Function getNameRec() getNameRec = objCsv.getNameRec End Function ' ' 機 能:区切り文字を設定 ' 引 数:del 区切り文字列 ' 例 :MyFsoCsv.setDelimiter "," ' Function setDelimiter(del) objCsv.setDelimiter del End Function ' ' 機 能:区切り文字を取得 ' 戻り値:文字 ' 例 :charDel = MyFsoCsv.getDelimiter ' Function getDelimiter() getDelimiter = objCsv.getDelimiter End Function ' ' 機 能:インデックス指定で項目を取得 ' 引 数:i インデックス(0オリジン) ' 戻り値:文字列 ' 例 :strString = MyFsoCsv.getValueByIndex(0) ' Function getValueByIndex(i) getValueByIndex = objCsv.getValueByIndex(i) End Function ' ' 機 能:インデックス指定で項目を設定 ' 引 数:i インデックス(0オリジン) ' value 文字列 ' 戻り値:文字列 ' 例 :MyFsoCsv.setValueByIndex 0, "STRING" ' Function setValueByIndex(i, value) objCsv.setValueByIndex i, value End Function ' ' 機 能:最終インデックスを取得 ' 戻り値:整数(0オリジン) ' 例 :intIndex = MyFsoCsv.getLastIndex ' Function getLastIndex() getLastIndex = objCsv.getLastIndex End Function ' ' 機 能:項目名に対応したインデックスを取得 ' 引 数:name 項目名 ' 戻り値:整数(0オリジン) ' 例 :intIndex = MyFsoCsv.getIndexByName("ELEMENT_01") ' Function getIndexByName(name) getIndexByName = objCsv.getIndexByName(name) End Function ' ' 機 能:項目名指定で項目を取得 ' 引 数:name 項目名 ' 戻り値:文字列 ' 例 :strString = MyFsoCsv.getValueByName("ELEMENT_01") ' Function getValueByName(name) getValueByName = objCsv.getValueByName(name) End Function ' ' 機 能:項目名指定で項目を設定 ' 引 数:name 項目名 ' value 文字列 ' 戻り値:文字列 ' 例 :MyFsoCsv.setValueByName "ELEMENT_01", 123 ' Function setValueByName(name, value) objCsv.setValueByName name, value End Function ' ' 機 能:開く ' 引 数:filename ファイル名 ' mode "r"(読み込み) or "w"(書き込み) ' 例 :MyFsoCsv.open "INPUT.TXT", "r" ' Function open(filename, mode) objFso.open filename, mode End Function ' ' 機 能:入力モードで開く ' 引 数:filename ファイル名 ' 例 :MyFsoCsv.openInput "INPUT.TXT" ' Function openInput(filename) objFso.openInput filename End Function ' ' 機 能:出力モードで開く ' 引 数:filename ファイル名 ' 例 :MyFsoCsv.openOutput "OUTPUT.TXT" ' Function openOutput(filename) objFso.openOutput filename End Function ' ' 機 能:FSOより1行CSVレコード取得し、objCsvへ保存 ' 戻り値:True(読めた) or False(読めなかった) ' 例 :MyFsoCsv.readLine ' Function readLine() Dim strRec strRec = objFso.readLine If objFso.isReadSuccess Then objCsv.setRec strRec readLine = True Else objCsv.setRec "" readLine = False End If End Function ' ' 機 能:読み取り成功チェック ' 戻り値:true or false ' 例 :While MyFsoCsv.isReadSuccess ' Function isReadSuccess() isReadSuccess = objFso.isReadSuccess End Function ' ' 機 能:読み取り失敗チェック ' 戻り値:true or false ' 例 :While Not MyFsoCsv.isReadFailure ' Function isReadFailure() isReadFailure = objFso.isReadFailure End Function ' ' 機 能:objCsvからFSOに1行CSVレコード出力 ' 例 :MyFsoCsv.writeLine ' Function writeLine() objFso.writeLine objCsv.getRec End Function ' ' 機 能:終端を取得 ' 戻 値:True(終端時) or False(非終端時) ' 例 :While Not MyFsoCsv.isEof ' Function isEof() isEof = objFso.isEof End Function ' ' 機 能:閉じる ' 例 :MyFsoCsv.close ' Function close() objFso.close End Function End Class ''================================================== '' '' ActiveX Data Object CSVクラス(文字コード指定可能) '' Class MyAdoCsv Dim objAdo Dim objCsv Sub Class_initialize() Set objAdo = new MyAdo Set objCsv = new MyCsv End Sub ' ' 機 能:レコードの初期化 ' 引 数:count レコードの項目数 ' 例 :MyAdoFso.initRec 16 ' Function initRec(count) objCsv.initRec count End Function ' ' 機 能:レコード(区切り文字含む)を設定 ' 引 数:str 文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :MyAdoFso.setRec strRec ' Function setRec(str) objCsv.setRec str End Function ' ' 機 能:レコードを取得 ' 戻 値:レコード(区切り文字含む) ' 例 :strRec = MyAdoFso.getRec ' Function getRec() getRec = objCsv.getRec End Function ' ' 機 能:項目名レコードを設定 ' 引 数:str 文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :MyAdoFso.setNameRec strNameRec ' Function setNameRec(str) objCsv.setNameRec str End Function ' ' 機 能:項目名レコードを取得 ' 戻り値:文字列(項目名1{区切り文字}項目名2{区切り文字}...) ' 例 :strNameRec = MyAdoFso.getNameRec ' Function getNameRec() getNameRec = objCsv.getNameRec End Function ' ' 機 能:区切り文字を設定 ' 引 数:del 区切り文字列 ' 例 :MyAdoFso.setDelimiter "," ' Function setDelimiter(del) objCsv.setDelimiter del End Function ' ' 機 能:区切り文字を取得 ' 戻り値:文字 ' 例 :charDel = MyAdoFso.getDelimiter ' Function getDelimiter() getDelimiter = objCsv.getDelimiter End Function ' ' 機 能:インデックス指定で項目を取得 ' 引 数:i インデックス(0オリジン) ' 戻り値:文字列 ' 例 :strString = MyAdoFso.getValueByIndex(0) ' Function getValueByIndex(i) getValueByIndex = objCsv.getValueByIndex(i) End Function ' ' 機 能:インデックス指定で項目を設定 ' 引 数:i インデックス(0オリジン) ' value 文字列 ' 戻り値:文字列 ' 例 :MyAdoFso.setValueByIndex 0, "STRING" ' Function setValueByIndex(i, value) objCsv.setValueByIndex i, value End Function ' ' 機 能:最終インデックスを取得 ' 戻り値:整数(0オリジン) ' 例 :intIndex = MyAdoFso.getLastIndex ' Function getLastIndex() getLastIndex = objCsv.getLastIndex End Function ' ' 機 能:項目名に対応したインデックスを取得 ' 引 数:name 項目名 ' 戻り値:整数(0オリジン) ' 例 :intIndex = MyAdoFso.getIndexByName("ELEMENT_01") ' Function getIndexByName(name) getIndexByName = objCsv.getIndexByName(name) End Function ' ' 機 能:項目名指定で項目を取得 ' 引 数:name 項目名 ' 戻り値:文字列 ' 例 :strString = MyAdoFso.getValueByName("ELEMENT_01") ' Function getValueByName(name) getValueByName = objCsv.getValueByName(name) End Function ' ' 機 能:項目名指定で項目を設定 ' 引 数:name 項目名 ' value 文字列 ' 戻り値:文字列 ' 例 :MyAdoFso.setValueByName "ELEMENT_01", 123 ' Function setValueByName(name, value) objCsv.setValueByName name, value End Function ' ' 機 能:開く ' 引 数:filename ファイル名 ' mode "r"(読み込み) or "w"(書き込み) ' charset "UTF-8" or "Shift_JIS" or "ASCII" etc ' bom True(UTF-8の時BOM付きで出力) or ' False(UTF-8の時BOM無しで出力) ' 例 :MyAdoCsv.open "INPUT.TXT", "r", "UTF-8", False ' Function open(filename, mode, charset, bom) objAdo.open filename, mode, charset, bom End Function ' ' 機 能:入力モードで開く ' 引 数:filename ファイル名 ' charset "UTF-8" or "Shift_JIS" or "ASCII" etc ' 例 :MyAdoCsv.openInput "INPUT.TXT", "UTF-8" ' Function openInput(filename, charset) objAdo.openInput filename, charset End Function ' ' 機 能:出力モードで開く ' 引 数:filename ファイル名 ' charset "UTF-8" or "Shift_JIS" or "ASCII" etc ' 例 :MyAdoCsv.openOutput "OUTPUT.TXT", "UTF-8" ' Function openOutput(filename, charset) objAdo.openOutput filename, charset End Function ' ' 機 能:ADOより1行CSVレコード取得し、objCsvへ保存 ' 戻り値:True(読めた) or False(読めなかった) ' 例 :MyAdoCsv.readLine ' Function readLine() Dim strRec strRec = objAdo.readLine If objAdo.isReadSuccess Then objCsv.setRec strRec readLine = True Else objCsv.setRec "" readLine = False End If End Function ' ' 機 能:読み取り成功チェック ' 戻り値:true or false ' 例 :While MyAdoCsv.isReadSuccess ' Function isReadSuccess() isReadSuccess = objAdo.isReadSuccess End Function ' ' 機 能:読み取り失敗チェック ' 戻り値:true or false ' 例 :While Not MyAdoCsv.isReadFailure ' Function isReadFailure() isReadFailure = objAdo.isReadFailure End Function ' ' 機 能:objCsvからADOに1行CSVレコード出力 ' 例 :MyAdoCsv.writeLine ' Function writeLine() objAdo.writeLine objCsv.getRec End Function ' ' 機 能:閉じる ' 例 :MyAdoCsv.close ' Function close() objAdo.close End Function ' ' 機 能:終端を取得 ' 戻 値:True(終端時) or False(非終端時) ' 例 :While Not MyAdoCsv.isEof ' Function isEof() objAdo.isEof End Function ' ' 機 能:保存する ' 例 :MyAdoCsv.save ' Private Function save() objAdo.save End Function ' ' 機 能:先頭の3bytesを除いて保存する ' 例 :MyAdoCsv.saveWithoutBom ' Private Function saveWithoutBom() objAdo.saveWithoutBom End Function End Class ''================================================== '' '' SORTクラス '' Class MySort Dim objRs Dim strDelimiter Dim strKey Dim bGetSuccess Sub Class_initialize() Set objRs = CreateObject("ADODB.Recordset") bGetSuccess = false End Sub ' ' 機 能:入力CSVレコードの区切り文字を指定する ' 引 数:str 区切り文字 ' 例 :MySort.setDelimiter "," ' Function setDelimiter(str) strDelimiter = str End Function ' ' 機 能:ソートキー項目を設定する ' 引 数:str "index:seq:type:max_len, ... ,max_rec_len" ' 例 :MySort.setKey "0:A:H:256,1:D:H:256,65535" ' index index number for sort-key in csv format(0 origin) ' seq A or D (ascending or descending) ' type H or X or S for raw character code ' 200 for VarChar ' 14 or N for Decimal ' 4 for Single ' 5 for Double ' 3 for Integer ' 20 for BigInt ' max_length max length for key ' max_rec_length max length for input rec ' Function setKey(str) Dim strKeys Dim strKeyDetails Dim i strKey = str strKeys = split(strKey, ",") i = 0 While i < UBound(strKeys) strKeyDetails = split(strKeys(i), ":") If strKeyDetails(2) = "X" or strKeyDetails(2) = "H" or strKeyDetails(2) = "S" Then If strKeyDetails(3) = "" Then objRs.Fields.Append "k" & strKeyDetails(0), 200 Else objRs.Fields.Append "k" & strKeyDetails(0), 200, Cint(strKeyDetails(3)) * 2 End If ElseIf strKeyDetails(2) = "N" Then If strKeyDetails(3) = "" Then objRs.Fields.Append "k" & strKeyDetails(0), 14 Else objRs.Fields.Append "k" & strKeyDetails(0), 14, strKeyDetails(3) End If Else If strKeyDetails(3) = "" Then objRs.Fields.Append "k" & strKeyDetails(0), strKeyDetails(2) Else objRs.Fields.Append "k" & strKeyDetails(0), strKeyDetails(2), strKeyDetails(3) End If End If i = i + 1 Wend strKeyDetails = split(strKeys(i), ":") objRs.Fields.Append "data", 200, strKeyDetails(0) objRs.Open End Function ' ' 機 能:ソート処理に入力レコードを渡す ' 引 数:str 入力レコード ' 例 :MySort.putRec strRec ' Function putRec(str) Dim strRecs Dim strKeys Dim strKeyDetails Dim i Dim objStr : Set objStr = new MyString objRs.AddNew strRecs = split(str & strDelimiter, strDelimiter) strKeys = split(strKey, ",") i = 0 While i < UBound(strKeys) strKeyDetails = split(strKeys(i), ":") If strKeyDetails(2) = "X" or strKeyDetails(2) = "H" or strKeyDetails(2) = "S" Then objStr.setValue(strRecs(strKeyDetails(0))) objRs.Fields("k" & strKeyDetails(0)).Value = objStr.getHexString Else objRs.Fields("k" & strKeyDetails(0)).Value = strRecs(strKeyDetails(0)) End If i = i + 1 Wend objRs.Fields("data").Value = str End Function ' ' 機 能:ソート処理を行う ' 例 :MySort.sort ' Function sort() Dim strKeys Dim strKeyDetails Dim i Dim strSortKey Dim strSeq strKeys = split(strKey, ",") i = 0 While i < UBound(strKeys) strKeyDetails = split(strKeys(i), ":") If strKeyDetails(1) = "A" Then strSeq = "ASC" Else strSeq = "DESC" End If If strSortKey = "" Then strSortKey = "k" & strKeyDetails(0) & " " & strSeq Else strSortKey = strSortKey & "," & "k" & strKeyDetails(0) & " " & strSeq End If i = i + 1 Wend objRs.Sort = strSortKey objRs.MoveFirst End Function ' ' 機 能:ソート結果を取り出す ' 例 :strRec = MySort.getRec ' Function getRec() If objRs.EOF Then getRec = "" bGetSuccess = false Else getRec = objRs.Fields("data").Value objRs.MoveNext bGetSuccess = true End If End Function ' ' 機 能:ソート結果読み取り成功チェック ' 戻り値:true or false ' 例 :While isGetSuccess ' Function isGetSuccess() isGetSuccess = bGetSuccess End Function ' ' 機 能:ソート結果読み取り失敗チェック ' 戻り値:true or false ' 例 :While Not isGetFailure ' Function isGetFailure() isGetFailure = Not isGetSuccess End Function ' ' 機 能:ソート結果の終端を取得 ' 戻 値:True(終端時) or False(非終端時) ' 例 :While Not isEof ' Function isEof() isEof = objRs.EOF End Function End Class ''================================================== '' '' スイッチを扱うクラス '' Class MySwitch Dim switch Sub Class_Initialize() switch = 0 End Sub ' ' 機 能:スイッチON ' 例 :MySwitch.turnOn ' Function turnOn switch = 1 End Function ' ' 機 能:スイッチOFF ' 例 :MySwitch.turnOff ' Function turnOff switch = 0 End Function ' ' 機 能:ONかチェック ' 例 :If MySwitch.isOn Then ' Function isOn Dim stat If switch = 1 Then stat = true Else stat = false End If isOn = stat End Function ' ' 機 能:OFFかチェック ' 例 :If MySwitch.isOff Then ' Function isOff isOff = (Not isOn) End Function End Class ''================================================== '' '' ディレクトリを扱うクラス '' Class MyDir Dim objFso Dim strDir Dim strFiles Dim intIndexStrFiles Dim strDirs Dim intIndexStrDirs Sub Class_Initialize() Set objFSo = CreateObject("Scripting.FileSystemObject") strDir = "." intIndexStrFiles = -1 intIndexStrDirs = -1 End Sub ' ' 機 能:相対パスでディレクトリを指定する ' 引 数:strDir ディレクトリ ' 例 :MyDir.setDir "." ' Function setDir(str) strDir = str End Function ' ' 機 能:ディレクトリの絶対パスを得る ' 戻り値:文字列 ' 例 :MyDir.getDirPath ' Function getDirPath() Dim objFolder Set objFolder = objFso.GetFolder(strDir) getDirPath = objFso.BuildPath(objFolder, "") End Function ' ' 機 能:ディレクトリ内の最初のファイル名を得る ' 戻り値:文字列 ' 例 :MyDir.getFirstFilename ' Function getFirstFilename() Dim objFolder : Set objFolder = objFso.GetFolder(strDir) Dim objFiles : Set objFiles = objFolder.Files Dim objFile Dim strFilesRec strFilesRec = "" For Each objFile in objFiles If strFilesRec = "" Then strFilesRec = objFile.Name Else strFilesRec = strFilesRec & Chr(9) & objFile.Name End If Next strFiles = Split(strFilesRec, Chr(9)) intIndexStrFiles = 0 If intIndexStrFiles <= UBound(strFiles) Then getFirstFilename = strFiles(intIndexStrFiles) Else getFirstFilename = "" End If End Function ' ' 機 能:次のファイル名を得る ' 戻り値:文字列 ' 例 :MyDir.getNextFilename ' Function getNextFilename() If intIndexStrFiles < UBound(strFiles) Then intIndexStrFiles = intIndexStrFiles + 1 getNextFilename = strFiles(intIndexStrFiles) Else getNextFilename = "" End If End Function ' ' 機 能:ディレクトリ内の最初のサブディレクトリ名を得る ' 戻り値:文字列 ' 例 :MyDir.getFirstDirname ' Function getFirstDirname() Dim objFolder : Set objFolder = objFso.GetFolder(strDir) Dim objDirs : Set objDirs = objFolder.SubFolders Dim objDir Dim strDirsRec strDirsRec = "" For Each objDir in objDirs If strDirsRec = "" Then strDirsRec = objDir.Name Else strDirsRec = strDirsRec & Chr(9) & objDir.Name End If Next strDirs = Split(strDirsRec, Chr(9)) intIndexStrDirs = 0 If intIndexStrDirs <= UBound(strDirs) Then getFirstDirname = strDirs(intIndexStrDirs) Else getFirstDirname = "" End If End Function ' ' 機 能:次のサブディレクトリ名を得る ' 戻り値:文字列 ' 例 :MyDir.getNextDirname ' Function getNextDirname() If intIndexStrDirs < UBound(strDirs) Then intIndexStrDirs = intIndexStrDirs + 1 getNextDirname = strDirs(intIndexStrDirs) Else getNextDirname = "" End If End Function End Class ''================================================== '' '' Excelを扱うクラス '' Class MyExcel Dim objExcel Dim strBookPath Sub Class_Initialize() Set objExcel = CreateObject("Excel.Application") objExcel.Visible = False objExcel.DisplayAlerts = False End Sub ' ' 機 能:ブックを開く ' 存在しないブックの場合は、その場で作成 ' 引 数:strBook ブック(絶対パスでも相対パスでもOK) ' 例 :MyExcel.open "foo.xlsx" ' Function open(strBook) Dim objDir : Set objDir = new MyDir Dim objStr : Set objStr = new MyString objDir.setDir(".") objStr.setValue strBook If objStr.isMatch("^[A-Za-z]:") Then strBookPath = strBook Else strBookPath = objDir.getDirPath() & "\" & strBook End If On Error Resume Next objExcel.Workbooks.Open(strBookPath) If Err.Number = 1004 Then objExcel.Workbooks.Add saveAs strBookPath objExcel.Workbooks.close objExcel.Workbooks.Open(strBookPath) End If On Error Goto 0 End Function ' ' 機 能:ブックを閉じる ' 例 :MyExcel.close ' Function close() objExcel.Workbooks.Close End Function ' ' 機 能:ブック内の指定したシートをcsv形式で保存する ' 引 数:intstrSheet シート ' strCsvFile csvファイル(絶対パスでも相対パスでもOK) ' 例 :MyExcel.saveAsCsv 1, "foo.csv" or MyExcel.saveAsCSv "Sheet1", "foo.csv" ' Function saveAsCsv(intstrSheet, strCsvFile) Dim objDir : Set objDir = new MyDir Dim objStr : Set objStr = new MyString Dim strOutFullPath Dim objSheet objStr.setValue strCsvFile If objStr.isMatch("^[A-Za-z]:") Then strOutFullPath = strCsvFile Else strOutFullPath = objDir.getDirPath() & "\" & strCsvFile End If Set objSheet = objExcel.Worksheets(intstrSheet) objSheet.SaveAs strOutFullPath, 6 ' 6 means to save as CSV End Function ' ' 機 能:ブックを指定したファイル名で保存する ' 引 数:strBook ブック(絶対パスでも相対パスでもOK) ' 例 :MyExcel.saveAs "foo.xlsx" ' Function saveAs(strBook) Dim objDir : Set objDir = new MyDir Dim objStr : Set objStr = new MyString Dim strOutBookPath objDir.setDir(".") objStr.setValue strBook If objStr.isMatch("^[A-Za-z]:") Then strOutBookPath = strBook Else strOutBookPath = objDir.getDirPath() & "\" & strBook End If objExcel.Workbooks(1).SaveAs strOutBookPath End Function ' ' 機 能:ブックを上書き保存する ' 引 数:strBook ブック ' 例 :MyExcel.save ' Function save() On Error Resume Next objExcel.Workbooks(1).Save On Error Goto 0 End Function ' ' 機 能:セルの値を取得する ' 引 数:intstrSheet シート ' strRange レンジ ' 戻り値:文字列 ' 例 :strStr = MyExcel.getCell(1, "B3") or strStr = MyExcel.getCell("Sheet1", "B3") ' Function getCell(intstrSheet, strRange) getCell = objExcel.Worksheets(intstrSheet).Range(strRange).Value End Function ' ' 機 能:セルに値を設定する ' 引 数:intstrSheet シート ' strRange レンジ ' strValue 設定値 ' 例 :MyExcel.setCell 1, "B3", 123 or MyExcel.setCell "Sheet1", "B3", "設定値" ' Function setCell(intstrSheet, strRange, strValue) objExcel.Worksheets(intstrSheet).Range(strRange).Value = strValue End Function ' ' 機 能:セルの計算式を取得する ' 引 数:intstrSheet シート ' strRange レンジ ' 戻り値:文字列 ' 例 :strStr = MyExcel.getFormula(1, "B3") or strStr = MyExcel.getFormula("Sheet1", "B3") ' Function getFormula(intstrSheet, strRange) getFormula = objExcel.Worksheets(intstrSheet).Range(strRange).Formula End Function ' ' 機 能:セルに計算式を設定する ' 引 数:intstrSheet シート ' strRange レンジ ' strFormula 計算式 ' 例 :MyExcel.setFormula 1, "B3", "=A10+B10" or MyExcel.setFormula "Sheet1", "B3", "=A10+B10" ' Function setFormula(intstrSheet, strRange, strFormula) objExcel.Worksheets(intstrSheet).Range(strRange).Formula = strFormula End Function ' ' 機 能:セルのフォント名を取得する ' 引 数:intstrSheet シート ' strRange レンジ ' 戻り値:文字列 ' 例 :strStr = MyExcel.getFontName(1, "B3") or strStr = MyExcel.getFontName("Sheet1", "B3") ' Function getFontName(intstrSheet, strRange) getFontName = objExcel.Worksheets(intstrSheet).Range(strRange).Font.Name End Function ' ' 機 能:セルのフォント名を設定する ' 引 数:intstrSheet シート ' strRange レンジ ' strFontName フォント名 ' 例 :MyExcel.setFontName 1, "B3", "MS ゴシック" or MyExcel.setFontName "Sheet1", "B3", "MS ゴシック" ' Function setFontName(intstrSheet, strRange, strFontName) objExcel.Worksheets(intstrSheet).Range(strRange).Font.Name = strFontName End Function ' ' 機 能:セルのフォントサイズを取得する ' 引 数:intstrSheet シート ' strRange レンジ ' 戻り値:数値 ' 例 :realNum = MyExcel.getFontSize(1, "B3") or realNum = MyExcel.getFontSize("Sheet1", "B3") ' Function getFontSize(intstrSheet, strRange) getFontSize = objExcel.Worksheets(intstrSheet).Range(strRange).Font.Size End Function ' ' 機 能:セルのフォントサイズを設定する ' 引 数:intstrSheet シート ' strRange レンジ ' realFontSize フォントサイズ ' 例 :MyExcel.setFontSize 1, "B3", 10.5 or MyExcel.setFontSize "Sheet1", "B3", 10.5 ' Function setFontSize(intstrSheet, strRange, realFontSize) objExcel.Worksheets(intstrSheet).Range(strRange).Font.Size = realFontSize End Function ' ' 機 能:セルの文字色を取得する ' 引 数:intstrSheet シート ' strRange レンジ ' 戻り値:数値 ' 例 :intNum = MyExcel.getForegroundColor(1, "B3") or intNum = MyExcel.getForegroundColor("Sheet1", "B3") ' Function getForegroundColor(intstrSheet, strRange) getForegroundColor = objExcel.Worksheets(intstrSheet).Range(strRange).Font.Color End Function ' ' 機 能:セルの文字色を設定する ' 引 数:intstrSheet シート ' strRange レンジ ' intColor 文字色 ' 例 :MyExcel.setForegroundColor 1, "B3", &HFF0000 or MyExcel.setForegroundColor "Sheet1", "B3", RGB(255,0,0) ' Function setForegroundColor(intstrSheet, strRange, intColor) objExcel.Worksheets(intstrSheet).Range(strRange).Font.Color = intColor End Function ' ' 機 能:セルの背景色を取得する ' 引 数:intstrSheet シート ' strRange レンジ ' 戻り値:数値 ' 例 :intNum = MyExcel.getBackgroundColor(1, "B3") or intNum = MyExcel.getBackgroundColor("Sheet1", "B3") ' Function getBackgroundColor(intstrSheet, strRange) getBackgroundColor = objExcel.Worksheets(intstrSheet).Range(strRange).Interior.Color End Function ' ' 機 能:セルの背景色を設定する ' 引 数:intstrSheet シート ' strRange レンジ ' intColor 背景色(&HBBGGRR) ' 例 :MyExcel.setBackgroundColor 1, "B3", &HFF0000 or MyExcel.setBackgroundColor "Sheet1", "B3", RGB(255,0,0) ' Function setBackgroundColor(intstrSheet, strRange, intColor) objExcel.Worksheets(intstrSheet).Range(strRange).Interior.Color = intColor End Function ' ' 機 能:セルの幅を取得する ' 引 数:intstrSheet シート ' strColumn カラム ' 戻り値:数値 ' 例 :realNum = MyExcel.getColumnWidth(1, "B") or realNum = MyExcel.getColumnWidth("Sheet1", "B") ' Function getColumnWidth(intstrSheet, strColumn) getColumnWidth = objExcel.Worksheets(intstrSheet).Columns(strColumn).ColumnWidth End Function ' ' 機 能:セルの幅を設定する ' 引 数:intstrSheet シート ' strColumn カラム ' realWidth 幅 ' 例 :MyExcel.setColumnWidth 1, "B3", 10.5 or MyExcel.setColumnWidth "Sheet1", "B3", 10.5 ' Function setColumnWidth(intstrSheet, strColumn, realWidth) objExcel.Worksheets(intstrSheet).Columns(strColumn).ColumnWidth = realWidth End Function ' ' 機 能:セルの高さを取得する ' 引 数:intstrSheet シート ' intRow 行 ' 戻り値:数値 ' 例 :realNum = MyExcel.getRowHeight(1, 2) or realNum = MyExcel.getRowHeight("Sheet1", 2) ' Function getRowHeight(intstrSheet, intRow) getRowHeight = objExcel.Worksheets(intstrSheet).Rows(intRow).RowHeight End Function ' ' 機 能:セルの高さを設定する ' 引 数:intstrSheet シート ' intRow 行 ' realHeight 高さ ' 例 :MyExcel.setRowHeight 1, 2, 10.5 or MyExcel.setRowHeight "Sheet1", 2, 10.5 ' Function setRowHeight(intstrSheet, intRow, realHeight) objExcel.Worksheets(intstrSheet).Rows(intRow).RowHeight = realHeight End Function ' ' 機 能:セルの書式形式を取得する ' 引 数:intstrSheet シート ' strRange レンジ ' 戻り値:文字列 ' 例 :strStr = MyExcel.getFormat(1, "B3") or strStr = MyExcel.getFormat("Sheet1", "B3") ' Function getFormat(intstrSheet, strRange) getFormat = objExcel.Worksheets(intstrSheet).Range(strRange).NumberFormatLocal End Function ' ' 機 能:セルの書式形式を設定する ' 引 数:intstrSheet シート ' strRange レンジ ' strFormat 書式形式 ' 例 :MyExcel.setFormat 1, "B3", "000000" or MyExcel.setFormat "Sheet1", "B3", "000000" ' Function setFormat(intstrSheet, strRange, strFormat) objExcel.Worksheets(intstrSheet).Range(strRange).NumberFormatLocal = strFormat End Function ' ' 機 能:指定したシートの印刷プレビューを表示する ' 引 数:intstrSheet シート ' 例 :MyExcel.preview 1 or MyExcel.preview "Sheet1" ' Function preview(intstrSheet) objExcel.Visible = True objExcel.Worksheets(intstrSheet).PrintPreview objExcel.Visible = False End Function ' ' 機 能:指定したシートを印刷する ' 引 数:intstrSheet シート ' 例 :MyExcel.print 1 or MyExcel.print "Sheet1" ' Function print(intstrSheet) objExcel.Worksheets(intstrSheet).PrintOut End Function ' ' 機 能:ブックを表示する ' 例 :MyExcel.onVisible ' Function onVisible() objExcel.Visible = True End Function ' ' 機 能:ブックを非表示にする ' 例 :MyExcel.offVisible ' Function offVisible() objExcel.Visible = False End Function ' ' 機 能:アラートを表示する ' 例 :MyExcel.onAlert ' Function onAlert() objExcel.DisplayAlerts = True End Function ' ' 機 能:アラートを非表示にする ' 例 :MyExcel.offAlert ' Function offAlert() objExcel.DisplayAlerts = False End Function End Class ''================================================== '' '' オプションを扱うクラス '' Class MyOption Dim objArg Dim objDict Dim strArrayNonOpt() Sub Class_initialize() Set objArg = new MyArg Set objDict = CreateObject("Scripting.Dictionary") ReDim strArrayNonOpt(-1) End Sub ' ' 機 能:扱うオプションを設定する ' 引 数:strAllOption "-option1=[y|n],..." ' y means option take value like "-option1 value" ' n means option do not take value" ' 例 :MyOption.initialize("-h=n,--help=n,-i=y,--input=y,-o=y,--output=y") ' Function initialize(strAllOption) Dim array Dim i array = Split(strAllOption, ",") i = 0 While i <= UBound(array) Dim arrayKv arrayKv = Split(array(i), "=") objDict.add arrayKv(0), arrayKv(1) i = i + 1 Wend End Function ' ' 機 能:オプションの値を取得する ' 引 数:strOptions オプション文字列 ' 戻り値:文字列 ' 例 :strOpt = MyOption.getValue("--input") ' Function getValue(strOption) Dim intIndex Dim strValue strValue = "" intIndex = 0 While intIndex < objArg.getCount If strOption = objArg.getValue(intIndex) Then intIndex = intIndex + 1 strValue = objArg.getValue(intIndex) intIndex = objArg.getCount End If intIndex = intIndex + 1 Wend getValue = strValue End Function ' ' 機 能:オプションが指定されているか取得する ' 引 数:strOptions オプション文字列 ' 戻り値:True or False ' 例 :If MyOption.isSpecified("--help") Then ' Function isSpecified(strOption) Dim intIndex Dim booleanRet booleanRet = false intIndex = 0 While intIndex < objArg.getCount If strOption = objArg.getValue(intIndex) Then booleanRet = true intIndex = objArg.getCount End If intIndex = intIndex + 1 Wend isSpecified = booleanRet End Function ' ' 機 能:オプション以外の文字列を取得する ' 戻り値:文字列(空白区切り) ' 例 :strNonOpt = MyOption.getNonOptions() ' Function getNonOptions() Dim intIndex Dim strValue strValue = "" intIndex = 0 While intIndex < objArg.getCount If objDict.Exists(objArg.getValue(intIndex)) Then If objDict(objArg.getValue(intIndex)) = "y" Then intIndex = intIndex + 1 End If Else If strValue = "" Then strValue = objArg.getValue(intIndex) Else strValue = strValue & " " & objArg.getValue(intIndex) End If End If intIndex = intIndex + 1 Wend getNonOptions = strValue End Function ' ' 機 能:オプション以外の文字列を配列で取得する ' 戻り値:文字列配列 ' 例 :strArraynNonOpt = MyOption.getArrayNonOptions() ' Function getArrayNonOptions() Dim intIndex Dim strValue Dim intNonOptIndex strValue = "" intIndex = 0 intNonOptIndex = 0 While intIndex < objArg.getCount If objDict.Exists(objArg.getValue(intIndex)) Then If objDict(objArg.getValue(intIndex)) = "y" Then intIndex = intIndex + 1 End If Else ReDim Preserve strArrayNonOpt(intNonOptIndex) strArrayNonOpt(intNonOptIndex) = objArg.getValue(intIndex) intNonOptIndex = intNonOptIndex + 1 End If intIndex = intIndex + 1 Wend getArrayNonOptions = strArrayNonOpt End Function End Class ''================================================== '' '' ファイルシステム操作を扱うクラス '' Class MyFsOpe Sub Class_Initialize() End Sub ' ' 機 能:一時ファイル名の取得 ' 戻り値:文字列 ' 例 :strTempFile = MyFsOpe.getTempFileName ' Function getTempFileName() getTempFileName = CreateObject("Scripting.FileSystemObject").GetTempName End Function ' ' 機 能:ディレクトリの作成 ' 引 数:strDirName ' 例 :MyFsOpe.createFolder "TEMP.dir" ' Function createFolder(strFileName) CreateObject("Scripting.FileSystemObject").createFolder strDirName End Function ' ' 機 能:ファイルの削除 ' 引 数:strFileName ' 例 :MyFsOpe.deleteFile "TEMP.tmp" ' Function deleteFile(strFileName) CreateObject("Scripting.FileSystemObject").DeleteFile strFileName, True End Function ' ' 機 能:ディレクトリの削除 ' 引 数:strDirName ' 例 :MyFsOpe.deleteFolder "TEMP.dir" ' Function deleteFolder(strDirName) CreateObject("Scripting.FileSystemObject").DeleteFolder strDirName, True End Function End Class ''================================================== '' '' 諸々を扱うクラス '' Class MyMisc Sub Class_Initialize() End Sub ' ' 機 能:プログラムの終了 ' 引 数:終了ステータス ' 例 :MyMisc.exitProg 0 ' Function exitProg(stat) WScript.Quit(stat) End Function End Class '================================================== ' ' デバッグ表示用 ' Function Debug(str) Dim objStdio : Set objStdio = new MyStdio objStdio.writeLine(str) End Function
cat.vbs
' ' Run as cscript //NoLogo cat.vbs [-n] [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objCountSw : Set objCountSw = new MySwitch Dim objSkipSw : Set objSkipSw = new MySwitch Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 Dim intCount : intCount = 0 ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-n=n") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo cat.vbs [-n] [input ...]" objStdio.writeLine "Concatenate input(s), or standard input, to standard output." objStdio.writeLine "" objStdio.writeLine " -n number all output lines" objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-n") Then objCountSw.turnOn End If openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then If objCountSw.isOn Then intCount = intCount + 1 objStdio.writeLine intCount & " " & strRec Else objStdio.writeLine strRec End If End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 0 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 0 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then closeFile openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
>cscript cat.vbs -h Usage : cscript //NoLogo cat.vbs [-n] [input ...] Concatenate input(s), or standard input, to standard output. -n number all output lines >type foo.txt cat.vbsはその名の通りUNIXのcat コマンドのまねっこです。mytoolkit.vbs を使っていろんなUNIXのまねっこ コマンドをでっちあげていきます。 >cscript cat.vbs foo.txt cat.vbsはその名の通りUNIXのcat コマンドのまねっこです。mytoolkit.vbs を使っていろんなUNIXのまねっこ コマンドをでっちあげていきます。 >cscript cat.vbs -n foo.txt 1 cat.vbsはその名の通りUNIXのcat 2 コマンドのまねっこです。mytoolkit.vbs 3 を使っていろんなUNIXのまねっこ 4 コマンドをでっちあげていきます。 >type foo.txt | cscript cat.vbs -n 1 cat.vbsはその名の通りUNIXのcat 2 コマンドのまねっこです。mytoolkit.vbs 3 を使っていろんなUNIXのまねっこ 4 コマンドをでっちあげていきます。 >
cl.vbs
' ' Run as cscript //NoLogo cl.vbs [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objSkipSw : Set objSkipSw = new MySwitch Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 Dim intCount : intCount = 0 Dim intTotalCount : intTotalCount = 0 Dim strCurrentFileName ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo cl.vbs [input ...]" objStdio.writeLine "Print newline counts for each input, and a total line if more than one input is specified." objStdio.writeLine "With no input, read standard input." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then Dim strInRec strInRec = strRec intCount = intCount + 1 End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then ' do nothing Else If UBound(strArrayFilesEtc) >= 0 Then objStdio.writeLine intCount & " " & strCurrentFileName intTotalCount = intTotalCount + intCount If UBound(strArrayFilesEtc) >= 1 Then objStdio.writeLine intTotalCount & " Total" End If Else objStdio.writeLine intCount End If End If ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 0 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) strCurrentFileName = strArrayFilesEtc(intArrayFilesEtcIndex) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 0 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then objStdio.writeLine intCount & " " & strCurrentFileName intTotalCount = intTotalCount + intCount closeFile intCount = 0 openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
>cscript cl.vbs -h Usage : cscript //NoLogo cl.vbs [input ...] Print newline counts for each input, and a total line if more than one input is specified. With no input, read standard input. >cscript cat.vbs -n foo.txt 1 cl.vbsはその名の通りUNIXのwc -l 2 コマンドのまねっこです。mytoolkit.vbs 3 を使っていろんなUNIXのまねっこ 4 コマンドをでっちあげていきます。 >cscript cl.vbs foo.txt 4 foo.txt >
cut.vbs
' ' Run as cscript //NoLogo cut.vbs -d "delimiter" -i "idx0,idx1, ..." [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objSkipSw : Set objSkipSw = new MySwitch Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 Dim strDelimiter : strDelimiter = "," Dim strArrayIndex ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-d=y,-i=y") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo cut.vbs [-d DELIMITER] -i INDEXIES [input ...]" objStdio.writeLine "Print selected parts of lines from each input to standard output." objStdio.writeLine "" objStdio.writeLine " -d DELIMITER use DELIMITER instead of comma for field delimiter." objStdio.writeLine " -i INDEXIES select only these fields(0 origin)." objStdio.writeLine " ex. 0,2,4 means 1st, 3rd, 5th fields should be selected." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-d") Then strDelimiter = objOpt.getValue("-d") End If strArrayIndex = Split(objOpt.getValue("-i"), ",") openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then Dim strOutRec : strOutRec = "" Dim strArrayInValues Dim i strArrayInValues = Split(strRec, strDelimiter) i = 0 While i < UBound(strArrayIndex) If CInt(strArrayIndex(i)) > UBound(strArrayInValues) Then strOutRec = strOutRec & "" & strDelimiter Else strOutRec = strOutRec & strArrayInValues(strArrayIndex(i)) & strDelimiter End If i = i + 1 Wend If CInt(strArrayIndex(i)) > UBound(strArrayInValues) Then ' do nothing Else strOutRec = strOutRec & strArrayInValues(strArrayIndex(i)) End If objStdio.writeLine strOutRec End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 0 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 0 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then closeFile openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
>cscript cut.vbs -h Usage : cscript //NoLogo cut.vbs [-d DELIMITER] -i INDEXIES [input ...] Print selected parts of lines from each input to standard output. -d DELIMITER use DELIMITER instead of comma for field delimiter. -i INDEXIES select only these fields(0 origin). ex. 0,2,4 means 1st, 3rd, 5th fields should be selected. >cscript cat.vbs foo.csv 1,リンゴ,赤色 2,イチゴ,赤色 3,ミカン,オレンジ色 4,バナナ,黄色 5,メロン,緑色 >cscript cut.vbs -d , -i 0,2 foo.csv 1,赤色 2,赤色 3,オレンジ色 4,黄色 5,緑色 >
grep.vbs
' ' Run as cscript //NoLogo grep.vbs [-v] REGEX [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objSkipSw : Set objSkipSw = new MySwitch Dim strCurrentFileName Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 1 Dim objOmitSw : Set objOmitSw = new MySwitch Dim objStr : Set objStr = new MyString ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 WScript.Quit '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-v=n") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo grep.vbs [-v] REGEX [input ...]" objStdio.writeLine "Search for REGEX in each input or standard input." objStdio.writeLine "REGEX is an regular expression." objStdio.writeLine "" objStdio.writeLine " -v select non-matching lines." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-v") Then objOmitSw.turnOn End If openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then objStr.setValue strRec If objOmitSw.isOff Then If objStr.isMatch(strArrayFilesEtc(0)) Then If UBound(strArrayFilesEtc) >= 2 Then objStdio.writeLine strCurrentFileName & ":" & strRec Else objStdio.writeLine strRec End If End If Else If Not objStr.isMatch(strArrayFilesEtc(0)) Then If UBound(strArrayFilesEtc) >= 2 Then objStdio.writeLine strCurrentFileName & ":" & strRec Else objStdio.writeLine strRec End If End If End If End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 1 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) strCurrentFileName = strArrayFilesEtc(intArrayFilesEtcIndex) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 1 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 1 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then closeFile openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
>cscript grep.vbs -h Usage : cscript //NoLogo grep.vbs [-v] REGEX [input ...] Search for REGEX in each input or standard input. REGEX is an regular expression. -v select non-matching lines. >cscript cat.vbs foo.txt grep.vbsはその名の通りUNIXのgrep コマンドのまねっこです。mytoolkit.vbs を使っていろんなUNIXのまねっこ コマンドをでっちあげていきます。 >cscript grep.vbs "^コマンド" foo.txt コマンドのまねっこです。mytoolkit.vbs コマンドをでっちあげていきます。 >cscript grep.vbs -v "^コマンド" foo.txt grep.vbsはその名の通りUNIXのgrep を使っていろんなUNIXのまねっこ >
head.vbs
' ' Run as cscript //NoLogo head.vbs [-l LINE_NUMBER] [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objSkipSw : Set objSkipSw = new MySwitch Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 Dim intCount : intCount = 0 Dim intLine : intLine = 10 ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-l=y") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo head.vbs [-l LINE_NUMBER] [input ...]" objStdio.writeLine "Print the first 10 lines of each input to standard output." objStdio.writeLine "With no input, read standard input." objStdio.writeLine "" objStdio.writeLine " -l LINE_NUMBER print the first LINE_NUMBER lines instead of the first 10." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-l") Then intLine = CInt(objOpt.getValue("-l")) End If openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then If intCount < intLine Then objStdio.writeLine strRec intCount = intCount + 1 Else objEndSw.turnOn intCount = 0 End If End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 0 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 0 Then readRec = objFsoIn.readLine If objEndSw.isOn or objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then closeFile openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
>cscript head.vbs -h Usage : cscript //NoLogo head.vbs [-l LINE_NUMBER] [input ...] Print the first 10 lines of each input to standard output. With no input, read standard input. -l LINE_NUMBER print the first LINE_NUMBER lines instead of the first 10. >cscript cat.vbs foo.txt head.vbsはその名の通りUNIXのhead コマンドのまねっこです。mytoolkit.vbs を使っていろんなUNIXのまねっこ コマンドをでっちあげていきます。 >cscript head.vbs -l 2 foo.txt head.vbsはその名の通りUNIXのhead コマンドのまねっこです。mytoolkit.vbs >
join.vbs
' ' Run as cscript //NoLogo join.vbs [-d DELIMITER] [-a ACTION] [-1 KEY1] [-2 KEY2] input1 input2 ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn1 : Set objFsoIn1 = new MyFso Dim objFsoIn2 : Set objFsoIn2 = new MyFso Dim isRec1HighValue : isRec1HighValue = False Dim isRec2HighValue : isRec2HighValue = False Dim strRec1 : strRec1 = "" Dim strRec2 : strRec2 = "" Dim strOldRec1 : strOldRec1 = "" Dim strOldRec2 : strOldRec2 = "" Dim objSkipSw : Set objSkipSw = new MySwitch Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 Dim strDelimiter : strDelimiter = "," Dim strAction : strAction = "m" Dim strKey1 : strKey1 = "0" Dim strKey2 : strKey2 = "0" Dim objTmpStr : Set objTmpStr = new MyString ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-d=y,-a=y,-1=y,-2=y") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo join.vbs [-d DELIMITER] [-a ACTION] [-1 KEY1] [-2 KEY2] input1 input2" objStdio.writeLine "For each pair of input lines with identical join fields, write a line to standard output." objStdio.writeLine "The default join field is the first, delimited by comma." objStdio.writeLine "When input1 or input2 (not both) is -, read standard input." objStdio.writeLine "" objStdio.writeLine " -d DELIMITER use DELIMITER instead of comma as input and output field separator." objStdio.writeLine " -a ACTION 1 means to print only unpairable lines from input1." objStdio.writeLine " 2 means to print only unpairable lines from input2." objStdio.writeLine " m means to print pairable lines from input1 and input2(default)." objStdio.writeLine " 1m means to print from input1 and pairable lines from input2." objStdio.writeLine " 2m means to print from input2 and pairable lines from input1." objStdio.writeLine " -1 KEY1 join on this KEY1 of input1(default 0)." objStdio.writeLine " -2 KEY2 join on this KEY2 of input2(default 0)." objStdio.writeLine " ex. 0,2,4 means 1st, 3rd, 5th fields are used as matching key." objStdio.writeLine " 0,2,4m means 1st, 3rd, 5th fields are used as matching key for multiple record." objStdio.writeLine " Do not specify ""m"" for both of KEY1 and KEY2." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-d") Then strDelimiter = objOpt.getValue("-d") End If If objOpt.isSpecified("-a") Then strAction = objOpt.getValue("-a") End If If objOpt.isSpecified("-1") Then strKey1 = objOpt.getValue("-1") End If If objOpt.isSpecified("-2") Then strKey2 = objOpt.getValue("-2") End If openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec1 = readRec1 strRec2 = readRec2 If isRec1HighValue and isRec2HighValue Then objEndSw.turnOn End If End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If isLessThan(strRec1, strKey1, isRec1HighValue, strRec2, strKey2, isRec2HighValue) Then if strAction = "1" or strAction = "1m" Then If getKey(strRec1, strKey1) = getKey(strOldRec2, strKey2) Then Else objStdio.writeLine strRec1 End If End If strOldRec1 = strRec1 strRec1 = readRec1 Elseif isGreaterThan(strRec1, strKey1, isRec1HighValue, strRec2, strKey2, isRec2HighValue) Then if strAction = "2" or strAction = "2m" Then If getKey(strOldRec1, strKey1) = getKey(strRec2, strKey2) Then Else objStdio.writeLine strRec2 End If End If strOldRec2 = strRec2 strRec2 = readRec2 Else If strAction = "1m" Then objStdio.writeLine strRec1 & strDelimiter & strRec2 Elseif strAction = "2m" Then objStdio.writeLine strRec2 & strDelimiter & strRec1 Elseif strAction = "m" Then objStdio.writeLine strRec1 & strDelimiter & strRec2 End If if isMultiKey(strKey1) and isMultiKey(strKey2) Then strOldRec1 = strRec1 strRec1 = readRec1 strOldRec2 = strRec2 strRec2 = readRec2 Else if isMultiKey(strKey2) Then Else strOldRec1 = strRec1 strRec1 = readRec1 End If if isMultiKey(strKey1) Then Else strOldRec2 = strRec2 strRec2 = readRec2 End If End If End If If isRec1HighValue and isRec2HighValue Then objEndSw.turnOn End If ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If strArrayFilesEtc(0) <> "-" Then objFsoIn1.openInput(strArrayFilesEtc(0)) End If If strArrayFilesEtc(1) <> "-" Then objFsoIn2.openInput(strArrayFilesEtc(1)) End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then If strArrayFilesEtc(0) <> "-" Then objFsoIn1.close End If End If If UBound(strArrayFilesEtc) >= 1 Then If strArrayFilesEtc(1) <> "-" Then objFsoIn2.close End If End If End Function Function readRec1 If strArrayFilesEtc(0) = "-" Then If objStdio.isEof Then isRec1HighValue = True Else readRec1 = objStdio.readLine End If Else If objFsoIn1.isEof Then isRec1HighValue = True Else readRec1 = objFsoIn1.readLine End If End If End Function Function readRec2 If strArrayFilesEtc(1) = "-" Then If objStdio.isEof Then isRec2HighValue = True Else readRec2 = objStdio.readLine End If Else If objFsoIn2.isEof Then isRec2HighValue = True Else readRec2 = objFsoIn2.readLine End If End If End Function Function isLessThan(rec1, key1, ishv1, rec2, key2, ishv2) If ishv1 and ishv2 Then isLessThan = False Elseif ishv1 Then isLessThan = False Elseif ishv2 Then isLessThan = True Else If getKey(rec1, key1) < getKey(rec2, key2) Then isLessThan = True Else isLessThan = False End If End If End Function Function isGreaterThan(rec1, key1, ishv1, rec2, key2, ishv2) If ishv1 and ishv2 Then isGreaterThan = False Elseif ishv1 Then isGreaterThan = True Elseif ishv2 Then isGreaterThan = False Else If getKey(rec1, key1) > getKey(rec2, key2) Then isGreaterThan = True Else isGreaterThan = False End If End If End Function Function getKey(rec, keys) Dim aRec Dim aKey Dim strKey Dim i objTmpStr.setValue keys aRec = split(rec, strDelimiter) aKey = split(objTmpStr.getReplace("m$", ""), ",") strKey = "" i = 0 While i <= UBound(aKey) If CInt(aKey(i)) <= UBound(aRec) Then strKey = strKey & aRec(aKey(i)) End if i = i + 1 Wend objTmpStr.setValue strKey getKey = objTmpStr.getHexString End Function Function isMultiKey(keys) objTmpStr.setValue keys isMultiKey = objTmpStr.isMatch("m$") End Function ' User coding end
>cscript join.vbs -h Usage : cscript //NoLogo join.vbs [-d DELIMITER] [-a ACTION] [-1 KEY1] [-2 KEY2] input1 input2 For each pair of input lines with identical join fields, write a line to standard output. The default join field is the first, delimited by comma. When input1 or input2 (not both) is -, read standard input. -d DELIMITER use DELIMITER instead of comma as input and output field separator. -a ACTION 1 means to print only unpairable lines from input1. 2 means to print only unpairable lines from input2. m means to print pairable lines from input1 and input2(default). 1m means to print from input1 and pairable lines from input2. 2m means to print from input2 and pairable lines from input1. -1 KEY1 join on this KEY1 of input1(default 0). -2 KEY2 join on this KEY2 of input2(default 0). ex. 0,2,4 means 1st, 3rd, 5th fields are used as matching key. 0,2,4m means 1st, 3rd, 5th fields are used as matching key for multiple record. Do not specify "m" for both of KEY1 and KEY2. >cscript cat.vbs foo.csv 1,リンゴ,赤色 2,イチゴ,赤色 3,ミカン,オレンジ色 4,バナナ,黄色 5,メロン,緑色 >cscript cat.vbs bar.csv 0,嫌い 2,好き 4,好き 6,嫌い >cscript join.vbs -d , -a m -1 0 -2 0 foo.csv bar.csv 2,イチゴ,赤色,2,好き 4,バナナ,黄色,4,好き >cscript join.vbs -d , -a 1 -1 0 -2 0 foo.csv bar.csv 1,リンゴ,赤色 3,ミカン,オレンジ色 5,メロン,緑色 >cscript join.vbs -d , -a 2 -1 0 -2 0 foo.csv bar.csv 0,嫌い 6,嫌い >cscript join.vbs -d , -a 1m -1 0 -2 0 foo.csv bar.csv 1,リンゴ,赤色 2,イチゴ,赤色,2,好き 3,ミカン,オレンジ色 4,バナナ,黄色,4,好き 5,メロン,緑色 >
mkkey.vbs
' ' Run as cscript //NoLogo mkkey.vbs -d "delimiter" -i "idx0,idx1, ..." [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objSkipSw : Set objSkipSw = new MySwitch Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 Dim strDelimiter : strDelimiter = "," Dim strArrayIndex Dim objString : Set objString = new MyString ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-d=y,-i=y") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo mkkey.vbs [-d DELIMITER] -i INDEXIES [input ...]" objStdio.writeLine "Add key string to head of record from each input to standard output." objStdio.writeLine "" objStdio.writeLine " -d DELIMITER use DELIMITER instead of comma for field delimiter." objStdio.writeLine " -i INDEXIES select only these fields to make key(0 origin)." objStdio.writeLine " ex. 0,2,4 means 1st, 3rd, 5th fields." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-d") Then strDelimiter = objOpt.getValue("-d") End If strArrayIndex = Split(objOpt.getValue("-i"), ",") openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then Dim strKey : strKey = "" Dim strArrayInValues Dim i strArrayInValues = Split(strRec, strDelimiter) i = 0 While i < UBound(strArrayIndex) If CInt(strArrayIndex(i)) > UBound(strArrayInValues) Then ' do nothing Else objString.setValue strArrayInValues(strArrayIndex(i)) strKey = strKey & objString.getHexString End If i = i + 1 Wend If CInt(strArrayIndex(i)) > UBound(strArrayInValues) Then ' do nothing Else objString.setValue strArrayInValues(strArrayIndex(i)) strKey = strKey & objString.getHexString End If objStdio.writeLine strKey & strDelimiter & strRec End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 0 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 0 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then closeFile openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
>cscript mkkey.vbs -h Usage : cscript //NoLogo mkkey.vbs [-d DELIMITER] -i INDEXIES [input ...] Add key string to head of record from each input to standard output. -d DELIMITER use DELIMITER instead of comma for field delimiter. -i INDEXIES select only these fields to make key(0 origin). ex. 0,2,4 means 1st, 3rd, 5th fields. >cscript cat.vbs foo.csv 1,リンゴ,赤色 2,イチゴ,赤色 3,ミカン,オレンジ色 4,バナナ,黄色 5,メロン,緑色 >cscript mkkey.vbs -d , -i 1,2 foo.csv 838A8393835390D49046,1,リンゴ,赤色 83438360835390D49046,2,イチゴ,赤色 837E834A83938349838C839383579046,3,ミカン,オレンジ色 836F8369836989A99046,4,バナナ,黄色 8381838D839397CE9046,5,メロン,緑色 >
prov.vbs
' ' Run as cscript //NoLogo prov.vbs [-p] [-d DELIMITER] -o OVERLAY.XLS [-i INPUT.CSV] -f FORMAT.TXT ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objOverlay : Set objOverlay = new MyExcel Dim objInput : Set objInput = new MyFso Dim objFormat : Set objFormat = new MyFso Dim objPreviewSw : Set objPreviewSw = new MySwitch Dim strDelimiter : strDelimiter = "," Dim strOverlayFilename : strOverlayFilename = "" Dim strInputFilename : strInputFilename = "" Dim strFormatFilename : strFormatFilename = "" Dim arrayFormatRec : arrayFormatRec = Array() Dim strRec ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-p=n,-d=y,-o=y,-i=y,-f=y") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo prov.vbs [-p] [-d DELIMITER] -o OVERLAY.XLS [-i INPUT.CSV] -f FORMAT.TXT" objStdio.writeLine "Print formatted data with overlay." objStdio.writeLine "" objStdio.writeLine " -p preview mode." objStdio.writeLine " -d DELIMITER use DELIMITER instead of comma for INPUT.CSV." objStdio.writeLine " -o OVERLAY.XLS overlay definition by excel." objStdio.writeLine " -i INPUT.CSV input data in csv format. If omitted then read stdin." objStdio.writeLine " -f FORMAT.TXT format definition for INPUT.CSV." objStdio.writeLine " each line should have like ""1=A1""" objStdio.writeLine " ""1=A1"" means ""1st column"" in INPUT.CSV should be placed into ""A1"" cell in OVERLAY.XLS" objEndSw.turnOn End If If objEndSw.isOff Then If objOpt.isSpecified("-p") Then objPreviewSw.turnOn End If If objOpt.isSpecified("-d") Then strDelimiter = objOpt.getValue("-d") End If strOverlayFilename = objOpt.getValue("-o") objOverlay.open(strOverlayFilename) strInputFilename = objOpt.getValue("-i") If strInputFilename <> "" Then objInput.openInput(strInputFilename) End If strFormatFilename = objOpt.getValue("-f") objFormat.openInput(strFormatFilename) Redim arrayFormatRec(-1) End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start Dim i Dim objStrFormatRec : Set objStrFormatRec = new MyString If objEndSw.isOff Then i = 0 objStrFormatRec.setValue objFormat.readLine While objFormat.isReadSuccess If objStrFormatRec.isMatch("^[0-9][0-9]*=[A-za-z][A-Za-z]*[0-9][0-9]*$") Then Redim Preserve arrayFormatRec(i) arrayFormatRec(i) = objStrFormatRec.getValue i = i + 1 End If objStrFormatRec.setValue objFormat.readLine Wend strRec = readRec End If Set objStrFormatRec = Nothing ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start Dim i Dim arrayIndexCell Dim objStr : Set objStr = new MyString Dim objCsv : Set objCsv = new MyCsv objCsv.setDelimiter strDelimiter objCsv.setRec strRec i = 0 While i <= Ubound(arrayFormatRec) objStr.setValue arrayFormatRec(i) arrayIndexCell = Split(arrayFormatRec(i), "=") objOverlay.setCell 1, arrayIndexCell(1), objCsv.getValueByIndex(CInt(arrayIndexCell(0))-1) i = i + 1 Wend If objPreviewSw.isOn Then objOverlay.preview 1 Else objOverlay.print 1 End If Set objStr = Nothing Set objCsv = Nothing strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then ' Do nothing Else objOverlay.close If strInputFilename <> "" Then objInput.close End If objFormat.close End If ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function readRec If strInputFilename = "" Then readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If Else readRec = objInput.readLine If objInput.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
sed.vbs
' ' Run as cscript //NoLogo sed.vbs regex string [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objSkipSw : Set objSkipSw = new MySwitch Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 2 Dim strRegex Dim strNewString Dim objTmpStr : Set objTmpStr = new MyString ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo sed.vbs REGEX STRING [input ...]" objStdio.writeLine "For each string matching the regular expression REGEX in input, substitute the STRING." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then strRegex = strArrayFilesEtc(0) strNewString = strArrayFilesEtc(1) openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then objTmpStr.setValue strRec objStdio.writeLine objTmpStr.getReplace(strRegex, strNewString) End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 2 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 2 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 2 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then closeFile openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
>cscript sed.vbs -h Usage : cscript //NoLogo sed.vbs REGEX STRING [input ...] For each string matching the regular expression REGEX in input, substitute the STRING. >cscript cat.vbs foo.txt sed.vbsはその名の通りUNIXのsed コマンドのまねっこです。mytoolkit.vbs を使っていろんなUNIXのまねっこ コマンドをでっちあげていきます。 >cscript sed.vbs "コ.*ド" "こまんど" foo.txt sed.vbsはその名の通りUNIXのsed こまんどのまねっこです。mytoolkit.vbs を使っていろんなUNIXのまねっこ こまんどをでっちあげていきます。 >
sel.vbs
' ' Run as cscript //NoLogo sel.vbs [-v] [-d DELIMITER] -c CONDITION [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objSkipSw : Set objSkipSw = new MySwitch Dim strCurrentFileName Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 Dim strDelimiter : strDelimiter = "," Dim strCondition Dim objOmitSw : Set objOmitSw = new MySwitch Dim objTmpStr1 : Set objTmpStr1 = new MyString Dim objTmpStr2 : Set objTmpStr2 = new MyString ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-v=n,-d=y,-c=y") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo sel.vbs [-v] [-d DELIMITER] -c CONDITION [input ...]" objStdio.writeLine "Search for CONDITION in each input or standard input." objStdio.writeLine "" objStdio.writeLine " -v select non-matching lines." objStdio.writeLine " -d DELIMITER use DELIMITER instead of comma for field delimiter." objStdio.writeLine " -c CONDITION ex. ""v(0) = 'foo' and v(2) > 'boo'""" objStdio.writeLine " ""grep(v(0),'^a') and grep(v(0),'z$')""" objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-v") Then objOmitSw.turnOn End If If objOpt.isSpecified("-d") Then strDelimiter = objOpt.getValue("-d") End If If objOpt.isSpecified("-c") Then strCondition = objOpt.getValue("-c") End If openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then Dim strInRec Dim v strInRec = strRec v = split(strInRec, strDelimiter) objTmpStr1.setValue strCondition If objOmitSw.isOff Then If Eval(objTmpStr1.getReplace("'", """")) Then If UBound(strArrayFilesEtc) >= 1 Then objStdio.writeLine strCurrentFileName & ":" & strRec Else objStdio.writeLine strInRec End If End If Else If Not Eval(objTmpStr1.getReplace("'", """")) Then If UBound(strArrayFilesEtc) >= 1 Then objStdio.writeLine strCurrentFileName & ":" & strRec Else objStdio.writeLine strInRec End If End If End IF End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 0 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) strCurrentFileName = strArrayFilesEtc(intArrayFilesEtcIndex) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 0 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then closeFile openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function Function grep(string, regex) objTmpStr2.setValue string grep = objTmpStr2.isMatch(regex) End Function ' User coding end
>cscript sel.vbs -h Usage : cscript //NoLogo sel.vbs [-v] [-d DELIMITER] -c CONDITION [input ...] Search for CONDITION in each input or standard input. -v select non-matching lines. -d DELIMITER use DELIMITER instead of comma for field delimiter. -c CONDITION ex. "v(0) = 'foo' and v(2) > 'boo'" "grep(v(0),'^a') and grep(v(0),'z$')" >cscript cat.vbs foo.csv 1,リンゴ,赤色 2,イチゴ,赤色 3,ミカン,オレンジ色 4,バナナ,黄色 5,メロン,緑色 >cscript sel.vbs -d , -c "v(2) = '赤色'" foo.csv 1,リンゴ,赤色 2,イチゴ,赤色 >cscript sel.vbs -d , -c "grep(v(1),'ン$')" foo.csv 3,ミカン,オレンジ色 5,メロン,緑色 >
selgrep.vbs
' ' Run as cscript //NoLogo selgrep.vbs [-v] [-d DELIMITER] -i INDEX REGEX [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objSkipSw : Set objSkipSw = new MySwitch Dim strCurrentFileName Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 1 Dim objOmitSw : Set objOmitSw = new MySwitch Dim strDelimiter : strDelimiter = "," Dim strIndex Dim strRegex Dim objTmpStr : Set objTmpStr = new MyString ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-v=n,-d=y,-i=y") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo selgrep.vbs [-v] [-d DELIMITER] -i INDEX REGEX [input ...]" objStdio.writeLine "Search for REGEX in INDEX of each input or standard input." objStdio.writeLine "REGEX is an regular expression." objStdio.writeLine "" objStdio.writeLine " -v select non-matching lines." objStdio.writeLine " -d DELIMITER use DELIMITER instead of comma for field delimiter." objStdio.writeLine " -i INDEX matching field(0 origin)." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-v") Then objOmitSw.turnOn End If If objOpt.isSpecified("-d") Then strDelimiter = objOpt.getValue("-d") End If If objOpt.isSpecified("-i") Then strIndex = objOpt.getValue("-i") End If strRegex = strArrayFilesEtc(0) openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then Dim strInRec Dim v strInRec = strRec v = split(strInRec, strDelimiter) If CInt(strIndex) <= UBound(v) Then objTmpStr.setValue v(CInt(strIndex)) If objOmitSw.isOff Then If objTmpStr.isMatch(strRegex) Then If UBound(strArrayFilesEtc) >= 2 Then objStdio.writeLine strCurrentFileName & ":" & strRec Else objStdio.writeLine strInRec End If End If Else If Not objTmpStr.isMatch(strRegex) Then If UBound(strArrayFilesEtc) >= 2 Then objStdio.writeLine strCurrentFileName & ":" & strRec Else objStdio.writeLine strInRec End If End If End If End If End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 1 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) strCurrentFileName = strArrayFilesEtc(intArrayFilesEtcIndex) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 1 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 1 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then closeFile openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
>cscript selgrep.vbs -h Usage : cscript //NoLogo selgrep.vbs [-v] [-d DELIMITER] -i INDEX REGEX [input ...] Search for REGEX in INDEX of each input or standard input. REGEX is an regular expression. -v select non-matching lines. -d DELIMITER use DELIMITER instead of comma for field delimiter. -i INDEX matching field(0 origin). >cscript cat.vbs foo.csv 1,リンゴ,赤色 2,イチゴ,赤色 3,ミカン,オレンジ色 4,バナナ,黄色 5,メロン,緑色 >cscript selgrep.vbs -d , -i 1 "ン$" foo.csv 3,ミカン,オレンジ色 5,メロン,緑色 >cscript selgrep.vbs -v -d , -i 1 "ン$" foo.csv 1,リンゴ,赤色 2,イチゴ,赤色 4,バナナ,黄色 >
sort.vbs
' ' Run as cscript //NoLogo sort.vbs [-d DELIMITER] -k KEY_INFO [-r RECLEN] [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objSkipSw : Set objSkipSw = new MySwitch Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 Dim objSort : Set objSort = new MySort Dim objDataExistSw : Set objDataExistSw = new MySwitch Dim strDelimiter : strDelimiter = "," Dim strKeyInfo Dim intRecLen : intRecLen = 1024 ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-d=y,-k=y,-r=y") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo sort.vbs [-d DELIMITER] -k KEY_INFO [-r RECLEN] [input ...]" objStdio.writeLine "Write sorted concatenation of all input(s) to standard output." objStdio.writeLine "" objStdio.writeLine " -d DELIMITER use DELIMITER instead of comma for field delimiter." objStdio.writeLine " -k KEY_INFO index:seq:type:max_length[,index:seq:type:max_length ...]" objStdio.writeLine " index index number for sort field in input(0 origin)" objStdio.writeLine " seq A or D (ascending or descending)" objStdio.writeLine " type S or N (string or number)" objStdio.writeLine " max_length max length for key" objStdio.writeLine " -r RECLEN max length for input record(default 1024)." objEndSw.turnOn objDataExistSw.turnOff End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-d") Then strDelimiter = objOpt.getValue("-d") End If If objOpt.isSpecified("-k") Then strKeyInfo = objOpt.getValue("-k") End If If objOpt.isSpecified("-r") Then intRecLen = CInt(objOpt.getValue("-r")) End If openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then objSort.setDelimiter(strDelimiter) objSort.setKey(strKeyInfo & "," & intRecLen) strRec = readRec If objEndSw.isOn Then objDataExistSw.turnOff Else objDataExistSw.turnOn End If End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then objSort.putRec(strRec) End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start If objDataExistSw.isOn Then objSort.sort() While Not objSort.isEof objStdio.writeLine objSort.getRec Wend End If ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 0 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 0 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then closeFile openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
>cscript sort.vbs -h Usage : cscript //NoLogo sort.vbs [-d DELIMITER] -k KEY_INFO [-r RECLEN] [input ...] Write sorted concatenation of all input(s) to standard output. -d DELIMITER use DELIMITER instead of comma for field delimiter. -k KEY_INFO index:seq:type:max_length[,index:seq:type:max_length ...] index index number for sort field in input(0 origin) seq A or D (ascending or descending) type S or N (string or number) max_length max length for key -r RECLEN max length for input record(default 1024). >cscript cat.vbs foo.csv 1,リンゴ,赤色 2,イチゴ,赤色 3,ミカン,オレンジ色 4,バナナ,黄色 5,メロン,緑色 >cscript sort.vbs -d , -k "0:D:N:1" foo.csv 5,メロン,緑色 4,バナナ,黄色 3,ミカン,オレンジ色 2,イチゴ,赤色 1,リンゴ,赤色 >
tail.vbs
' ' Run as cscript //NoLogo tail.vbs [-l LINE_NUMBER] [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 Dim intLine : intLine = 10 Dim objSortA Dim objSortD Dim intCount : intCount = 0 Dim objTmpStr : Set objTmpStr = new MyString Dim objReadEndSw : Set objReadEndSw = new MySwitch ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-l=y") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo tail.vbs [-l LINE_NUMBER] [input ...]" objStdio.writeLine "Print the last 10 lines of each input to standard output." objStdio.writeLine "With no input, read standard input." objStdio.writeLine "" objStdio.writeLine " -l LINE_NUMBER output the last LINE_NUMBER lines, instead of the last 10." objEndSw.turnOn Else objEndSw.turnOff End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-l") Then intLine = CInt(objOpt.getValue("-l")) End If End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start Set objSortA = new MySort Set objSortD = new MySort objSortA.setDelimiter(" ") objSortA.setKey("0:A:N:16,32000") objSortD.setDelimiter(" ") objSortD.setKey("0:D:N:16,32000") openFile intCount = 0 objReadEndSw.turnOff strRec = readRec While objReadEndSw.isOff intCount = intCount + 1 objSortD.putRec(intCount & " " & strRec) strRec = readRec Wend if intCount > 0 Then objSortD.sort() intCount = 0 While (Not objSortD.isEof) and intCount < CInt(intLine) objSortA.putRec(objSortD.getRec) intCount = intCount + 1 Wend objSortA.sort() While Not objSortA.isEof objTmpStr.setValue objSortA.getRec objStdio.writeLine objTmpStr.getReplace("^[0-9]* ", "") Wend End If Set objSortA = Nothing Set objSortD = Nothing closeFile intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 If intArrayFilesEtcIndex > UBound(strArrayFilesEtc) Then objEndSw.turnOn End If ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 0 Then objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 0 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then objReadEndSw.turnOn End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objReadEndSw.turnOn End If End If End Function ' User coding end
>cscript tail.vbs -h Usage : cscript //NoLogo tail.vbs [-l LINE_NUMBER] [input ...] Print the last 10 lines of each input to standard output. With no input, read standard input. -l LINE_NUMBER output the last LINE_NUMBER lines, instead of the last 10. >cscript cat.vbs foo.txt tail.vbsはその名の通りUNIXのtail コマンドのまねっこです。mytoolkit.vbs を使っていろんなUNIXのまねっこ コマンドをでっちあげていきます。 >cscript tail.vbs -l 2 foo.txt を使っていろんなUNIXのまねっこ コマンドをでっちあげていきます。 >
tee.vbs
' ' Run as cscript //NoLogo tee.vbs output ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoOut : Set objFsoOut = new MyFso Dim strRec Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo tee.vbs output" objStdio.writeLine "Copy standard input to output, and also to standard output." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start writeRec strRec objStdio.writeLine strRec strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 0 Then objFsoOut.openOutput(strArrayFilesEtc(0)) End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then objFsoOut.close End If End Function Function readRec readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End Function Function writeRec(rec) objFsoOut.writeLine rec End Function Function isEof isEof = objStdio.isEof End Function ' User coding end
uniq.vbs
' ' Run as cscript //NoLogo uniq.vbs [-d|-c] [input ...] ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim objFsoIn : Set objFsoIn = new MyFso Dim strRec Dim objSkipSw : Set objSkipSw = new MySwitch Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 Dim strOldRec : strOldRec = "" Dim strNewRec : strNewRec = "" Dim intCount : intCount = 0 Dim objFirstRecSw : Set objFirstRecSw = new MySwitch : objFirstRecSw.turnOn Dim objFirstDupSw : Set objFirstDupSw = new MySwitch : objFirstDupSw.turnOn Dim objUniqSw : Set objUniqSw = new MySwitch : objUniqSw.turnOn Dim objDupSw : Set objDupSw = new MySwitch Dim objCountSw : Set objCountSw = new MySwitch ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-d=n,-c=n") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo uniq.vbs [-d|-c] [input ...]" objStdio.writeLine "Filter adjacent matching lines from input (or standard input), writing to standard output." objStdio.writeLine "With no options, matching lines are merged to the first occurrence." objStdio.writeLine "" objStdio.writeLine " -d only print duplicate lines." objStdio.writeLine " -c prefix lines by the number of occurrences." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-d") Then objDupSw.turnOn objUniqSw.turnOff End If If objOpt.isSpecified("-c") Then objCountSw.turnOn objUniqSw.turnOff End If openFile End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then strRec = readRec End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start If objSkipSw.isOff Then strNewRec = strRec If objUniqSw.isOn Then If objFirstRecSw.isOn Then objStdio.writeLine strNewRec objFirstRecSw.turnOff Else If strNewRec <> strOldRec Then objStdio.writeLine strNewRec End If End If strOldRec = strNewRec Elseif objDupSw.isOn Then If objFirstRecSw.isOn Then objFirstRecSw.turnOff Else If strNewRec = strOldRec Then If objFirstDupSw.isOn Then objStdio.writeLine strNewRec objFirstDupSw.turnOff End If Else objFirstDupSw.turnOn End If End If strOldRec = strNewRec Elseif objCountSw.isOn Then If objFirstRecSw.isOn Then intCount = intCount + 1 objFirstRecSw.turnOff Else If strNewRec = strOldRec Then intCount = intCount + 1 Else objStdio.writeLine intCount & " " & strOldRec intCount = 1 End If End If strOldRec = strNewRec End If End If strRec = readRec ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start If objCountSw.isOn Then objStdio.writeLine intCount & " " & strOldRec End If ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start closeFile ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start Function openFile If UBound(strArrayFilesEtc) >= 0 Then objEndSw.turnOff objFsoIn.openInput(strArrayFilesEtc(intArrayFilesEtcIndex)) intArrayFilesEtcIndex = intArrayFilesEtcIndex + 1 End If End Function Function closeFile If UBound(strArrayFilesEtc) >= 0 Then objFsoIn.close End If End Function Function readRec If UBound(strArrayFilesEtc) >= 0 Then readRec = objFsoIn.readLine If objFsoIn.isReadFailure Then If intArrayFilesEtcIndex <= UBound(strArrayFilesEtc) Then closeFile openFile objSkipSw.turnOn Else objEndSw.turnOn End If Else objSkipSw.turnOff End If Else readRec = objStdio.readLine If objStdio.isReadFailure Then objEndSw.turnOn End If End If End Function ' User coding end
>cscript uniq.vbs -h Usage : cscript //NoLogo uniq.vbs [-d|-c] [input ...] Filter adjacent matching lines from input (or standard input), writing to standard output. With no options, matching lines are merged to the first occurrence. -d only print duplicate lines. -c prefix lines by the number of occurrences. >cscript cat.vbs foo.csv 1,リンゴ,赤色 2,イチゴ,赤色 3,ミカン,オレンジ色 4,バナナ,黄色 5,メロン,緑色 2,イチゴ,赤色 4,バナナ,黄色 >cscript sort.vbs -d , -k "0:A:S:1,1:A:S:6,2:A:S:10" foo.csv | cscript uniq.vbs 1,リンゴ,赤色 2,イチゴ,赤色 3,ミカン,オレンジ色 4,バナナ,黄色 5,メロン,緑色 >cscript sort.vbs -d , -k "0:A:S:1,1:A:S:6,2:A:S:10" foo.csv | cscript uniq.vbs -d 2,イチゴ,赤色 4,バナナ,黄色 >cscript sort.vbs -d , -k "0:A:S:1,1:A:S:6,2:A:S:10" foo.csv | cscript uniq.vbs -c 1 1,リンゴ,赤色 2 2,イチゴ,赤色 1 3,ミカン,オレンジ色 2 4,バナナ,黄色 1 5,メロン,緑色 >
xls2csv.vbs
' ' Run as "cscript //NoLogo xls2csv.vbs [-sn SheetName|-si SheetIndex] [-i input.xls] [-o output.csv]" ' '-------------------------------------------------- ' 共通処理 ' Option Explicit Function include(filename) ExecuteGlobal CreateObject("Scripting.FileSystemObject").OpenTextFile(filename).ReadAll() End Function include("mytoolkit.vbs") '-------------------------------------------------- ' 大局変数 ' Dim objEndSw : Set objEndSw = new MySwitch Dim objMisc : Set objMisc = new MyMisc ' User coding start Dim objOpt : Set objOpt = new MyOption Dim objStdio : Set objStdio = new MyStdio Dim strInFile : strInFile = "" Dim strOutFile : strOutFile = "" Dim objDir : Set objDir = new MyDir Dim objExcel : Set objExcel = new MyExcel Dim objFilename : Set objFilename = new MyString Dim objFsOpe : Set objFsOpe = new MyFsOpe Dim strSheetName : strSheetName = "" Dim intSheetIndex : intSheetIndex = 1 Dim strArrayFilesEtc Dim intArrayFilesEtcIndex : intArrayFilesEtcIndex = 0 ' User coding end '-------------------------------------------------- ' 処理開始 ' sub_open ' オープン処理 sub_initialize ' 開始処理 While objEndSw.isOff sub_main ' 主処理 Wend sub_terminate ' 終了処理 sub_close ' クローズ処理 objMisc.exitProg(0) '-------------------------------------------------- ' オープン処理 ' Sub sub_open ' User coding start objOpt.initialize("-h=n,--help=n,-sn=y,-si=y,-i=y,-o=y") If objOpt.isSpecified("-h") or objOpt.isSpecified("--help") Then objStdio.writeLine "Usage : cscript //NoLogo xls2csv.vbs [-sn SheetName|-si SheetIndex] [-i input.xls] [-o output.csv]" objStdio.writeLine "Convert a sheet of excel to csv." objStdio.writeLine "" objStdio.writeLine " -sn SheetName SheetName must be specified in STRING." objStdio.writeLine " -si SheetIndex SheetIndex must be specified in INTEGER." objStdio.writeLine " If SheetName and SheetIndex are not specified, it is assumed that ""-si 1"" is specified." objStdio.writeLine " -i input.xls specify input excel file." objStdio.writeLine " -o output.csv specify output csv file." objStdio.writeLine " If both of input.xls and output.csv are not specified, all *.xls and *.xlsx in current directory will be converted into *.csv." objStdio.writeLine " If input.xls is specified and output.csv is not specified, input.xls will be converted into stdout." objEndSw.turnOn End If strArrayFilesEtc = objOpt.getArrayNonOptions If objEndSw.isOff Then If objOpt.isSpecified("-sn") Then strSheetName = objOpt.getValue("-sn") End If If objOpt.isSpecified("-si") Then intSheetIndex = CInt(objOpt.getValue("-si")) End If If objOpt.isSpecified("-i") Then strInFile = objOpt.getValue("-i") End If If objOpt.isSpecified("-o") Then strOutFile = objOpt.getValue("-o") End If End If ' User coding end End Sub '-------------------------------------------------- ' 開始処理 ' Sub sub_initialize ' User coding start If objEndSw.isOff Then If strInFile = "" Then objDir.setDir(".") objFilename.setValue objDir.getFirstFilename If objFilename.getValue = "" Then objEndSw.turnOn End If End If End If ' User coding end End Sub '-------------------------------------------------- ' 主処理 ' Sub sub_main ' User coding start Dim strCsvFilename If strInFile = "" Then If objFilename.isMatch("\.[Xx][Ll][Ss][XxMm]*$") Then ' On Error Resume Next objExcel.open objFilename.getValue objExcel.offAlert strCsvFilename = objFilename.getReplace("\.[Xx][Ll][Ss][XxMm]*$", ".csv") If strSheetName = "" Then objExcel.saveAsCsv intSheetIndex, strCsvFilename Else objExcel.saveAsCsv strSheetName, strCsvFilename End If objExcel.close ' On Error Goto 0 objStdio.writeLine objFilename.getValue & " -> " & strCsvFilename End If objFilename.setValue objDir.getNextFilename If objFilename.getValue = "" Then objEndSw.turnOn End If Else ' On Error Resume Next objExcel.open strInFile objExcel.offAlert If strOutFile = "" Then strCsvFilename = objFsOpe.getTempFileName Else strCsvFilename = strOutFile End If If strSheetName = "" Then objExcel.saveAsCsv intSheetIndex, strCsvFilename Else objExcel.saveAsCsv strSheetName, strCsvFilename End If objExcel.close ' On Error Goto 0 If strOutFile = "" Then Dim objTemp : Set objTemp = new MyFso Dim strRec objTemp.openInput strCsvFilename strRec = objTemp.readLine While objTemp.isReadSuccess objStdio.writeLine strRec strRec = objTemp.readLine Wend objTemp.close objFsOpe.deleteFile strCsvFilename Set objTemp = Nothing End If objEndSw.turnOn End If ' User coding end End Sub '-------------------------------------------------- ' 終了処理 ' Sub sub_terminate ' User coding start ' User coding end End Sub '-------------------------------------------------- ' クローズ処理 ' Sub sub_close ' User coding start ' User coding end End Sub '-------------------------------------------------- ' その他の処理 ' ' User coding start ' User coding end