Windows Script Host(wsh)を用いてテキストファイルを書き換える方法を教えてください。


aaa.txtというファイルに、
-----
1,a,b
-----
と入っているときに、これを
-----
2,a,b
-----
と書き換えたいです。

・かならず、上記のような形式で1行データが入っています。
・最初のカンマまでの数字を1増やしたいです。
・それ以外は、何も書き換えないようにしたいです。

繰り返し実行すると
3,a,b
4,a,b
5,a,b
と変化していくようにしたいです。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/01/21 18:59:23
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:van-dine No.1

回答回数108ベストアンサー獲得回数11

ポイント100pt

JavaScript

var FSO = new ActiveXObject("Scripting.FileSystemObject");
var tmpNm = FSO.GetTempName();

var IPF = FSO.OpenTextFile("aaa.txt", 1, false);
var OPF = FSO.OpenTextFile(tmpNm , 2, true);

while(!IPF.AtEndOfStream)
{
  var str = IPF.ReadLine();
  var mch = str.match(/^(\d+),a,b$/);
  if(mch)
  {
    OPF.WriteLine((parseInt(mch[1]) + 1) + ",a,b");
  }
  else
  {
    OPF.WriteLine(str);
  }
}

IPF.Close();
OPF.Close();
IPF = null;
OPF = null;

var tmpFl = FSO.GetFile(tmpNm);
tmpFl.Copy("aaa.txt", true);
tmpFl.Delete(true);
tmpFl = null;

VBScript

Set FSO = CreateObject("Scripting.FileSystemObject")
tmpNm = FSO.GetTempName
Set RegTrgt = New RegExp
With RegTrgt
  .Pattern = "^(\d+),a,b$"
  .IgnoreCase = False
  .Global = False
End With

Set IPF = FSO.OpenTextFile("aaa.txt", 1, false)
Set OPF = FSO.OpenTextFile(tmpNm    , 2, true )

Do Until IPF.AtEndOfStream
  str = IPF.ReadLine
  If regTrgt.Test(str) Then
    OPF.WriteLine (RegTrgt.Execute(str)(0).SubMatches(0) + 1) & ",a,b"
  Else
    OPF.WriteLine str
  End If
Loop

IPF.Close
OPF.Close
Set IPF = Nothing
Set OPF = Nothing

Set tmpFl = FSO.GetFile(tmpNm)
tmpFl.Copy "aaa.txt", true
tmpFl.Delete true
Set tmpFl = Nothing

書き換えには、正規検索を使っています。

JavaScriptの方が正規検索の使い勝手が良いです。

id:bonyan

ありがとうございました。希望通りの動作をしています。

これにて質問を終了させていただきます。

2009/01/21 18:59:09
  • id:gatchan
    ちなみにWSHでは
    VBScriptとJScriptの2言語です。(MSのスクリプト言語ですので)
    あとCScriptか。

    JavaScriptではなくJScriptですので混同されないほうがよいかもしれません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません