その他

vbsで各行の行頭、行始めのインデント・タグ・スペースを削除する[No42]

スポンサーリンク

正規表現を利用して行頭のインデント(タブ、スペース、文字が始まる前まで)を削除するプログラムを紹介します。

このプログラムはInputファイルに空の改行が含まれているか、含まれていないかもポイントになります。

空の改行がない場合:Inputファイルについて

下記リンク先の記事の「bookmarks_YYYY_MM_DD.html」ファイルと同じファイルを使います。

no image
複数行のテキストファイルを1行にする。bat、vbs(Scripting.FileSystemObject、ADODB.Stream)[No41]
今回は、複数行あるテキストファイルを読み込んで、別の新しいファイルに1行に変換して出力するプログラムを紹介します。 ここでは次の3種類の実行ファイルを用いた方法を紹介しますが、おすす ...

プログラム

プログラム中のポイント1について。正規表現「\s」は「[ \t\n\r\f]」(※\t直前の半角スペースは意味を持っているので削除しない)と同じです。「\s」「[ \t\n\r\f]」と「[ \t]」は意味は違いますがと同じ結果になります。

プログラム中のポイント2について。「^」を行全体で利用するため、「MultiLine」オプションをOn(True)にします。

参考サイト

MicrosoftのVBScript.RegExpのページにMultiLineの記述がない [VBScript] : スクリプトちょっとメモ

正規表現のオプション | Microsoft Docs


'------------------------------------------------------------------------
'定数定義
'------------------------------------------------------------------------
Dim filenameIn   : filenameIn   = "bookmarks_"
Dim extensionIn  : extensionIn  = ".html"

Dim filenameOut  : filenameOut  = "workfile1"
Dim extensionOut : extensionOut = ".html"
'------------------------------------------------------------------------
'カレントディレクトリのパス
'------------------------------------------------------------------------
Dim Obj00 : Set Obj00 = WScript.CreateObject("Scripting.FileSystemObject")
Dim var00 : var00     = Obj00.getParentFolderName(WScript.ScriptFullName)
'------------------------------------------------------------------------
'01:Inputファイルのパスを取得する
'------------------------------------------------------------------------
Dim Obj01     : Set Obj01     = CreateObject("Scripting.FilesystemObject")
Dim ObjFolder : Set ObjFolder = Obj01.getFolder(var00)
Dim ObjFiles  : Set ObjFiles  = ObjFolder.Files

Dim TempFileName
For Each TempFileName In ObjFiles
	If Right(TempFileName.Name,Len(extensionIn)) = extensionIn Then
		If Left(TempFileName.Name,Len(filenameIn)) = filenameIn Then
			Dim filePathIn  : filePathIn = TempFileName.Path
			Dim filePathOut : filePathOut = var00 & "\" & filenameOut & extensionOut
			Exit For
		Else
			MsgBox("The target file does not exist.")
			Set Obj01 = Nothing
			WScript.Quit
		End If
	End If
Next
Set Obj01     = Nothing
Set ObjFolder = Nothing
Set ObjFiles  = Nothing
'------------------------------------------------------------------------
'02:Inputファイルを読み込む
'------------------------------------------------------------------------
'Stream オブジェクト : https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/stream-object-properties-methods-and-events?view=sql-server-ver15
Dim Obj0201 : Set Obj0201 = CreateObject("ADODB.Stream")
With Obj0201
	.Type = 2 'adTypeText
	.Charset = "UTF-8"
	.Open
	.LoadFromFile filePathIn
End With

Dim TempTextBefore : TempTextBefore = Obj0201.ReadText(-1) 'adReadAll
Obj0201.Close
Set Obj0201 = Nothing
'------------------------------------------------------------------------
'文字列の置換
'------------------------------------------------------------------------
Dim regEx : Set regEx = New RegExp
With regEx
   .Pattern = "^[ \t]+" '★ポイント1:【^\s+】、【^[ \t\n\r\f]+】
   .IgnoreCase = True
   .Global = True
   .MultiLine = True    '★ポイント2
End With

Dim TempTextAfter
TempTextAfter = regEx.Replace(TempTextBefore, "")
'------------------------------------------------------------------------
'03:Outファイルを作成する
'------------------------------------------------------------------------
'CreateTextFile : https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/createtextfile-method
Dim Obj0301 : Set Obj0301 = WScript.CreateObject("Scripting.FileSystemObject")
Dim Obj0302 : Set Obj0302 = Obj0301.CreateTextFile(filePathOut,True,True) 'CreateTextFile(filename,[overwrite,[unicode]])
Obj0302.Close
Set Obj0301 = Nothing
Set Obj0302 = Nothing
'------------------------------------------------------------------------
'04:Outファイルに追記する
'------------------------------------------------------------------------
'Stream オブジェクト : https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/stream-object-properties-methods-and-events?view=sql-server-ver15
Dim Obj04 : Set Obj04 = CreateObject("ADODB.Stream")

With Obj04
	.Mode = 3 'adModeReadWrite
	.Type = 2 'adTypeText
	.Charset = "UTF-8"
	.Open
	.WriteText TempTextAfter,0 'adWriteChar
	.SaveToFile filePathOut,2 'adSaveCreateOverWrite
End With

Obj04.Close
Set Obj04 = Nothing

実行結果(「.Pattern = "^[ \t]+"」、「.Pattern = "^\s+"」、「.Pattern = "^[ \t\n\r\f]+"」)

スポンサーリンク

空の改行がある場合:Inputファイルについて

先程の「空の改行がない場合:Inputファイルについて」のファイルに、適当に改行を入れたファイルを使います。

実行結果(「.Pattern = "^[ \t]+"」)

先程の「DeleteIndentAtBeginningOfLine.vbs」と同じファイルを実行した場合の結果です。

実行結果(「.Pattern = "^\s+"」、「.Pattern = "^[ \t\n\r\f]+"」)

先程の「DeleteIndentAtBeginningOfLine.vbs」の★ポイント1の「Pattern」だけ「"^\s+"」「"^[ \t\n\r\f]+"」に変えて実行した結果です。

ワンポイント

正規表現を利用する際は、サクラエディタの検索ウィンドウにある「正規表現」を利用すると抽出箇所がわかりやすいです。

注意

実行環境によって改行コードが変わるので、実行結果も異なります。この記事に書かれている内容は、すべてWindowsを実行環境とした場合の話です。

雑記

本日は大安ですね。

大安といえばめでたい日であり、結婚式を挙げる人や旅行や引越しを決行する人たちも多く見られる日です。大安はその字の如く「大いに安し」という意味で、「非常に穏やかで不安がない」、「1日中、何事も上手くいく日」という日を表しています。

大安は暦上の日を「大安」、「仏滅」、「友引」、「先勝」、「先負」、「赤口」の6種類に分け、日毎に縁起の良し悪しを表す「六曜(ろくよう)」の1つです。6つの中で1番縁起が良いとされているのが大安です。

おめでたい席でのスピーチの冒頭などで「本日は大変お日柄も良く」というフレーズがつかわれることがありますよね。あの「お日柄」は六曜を指していて、「お日柄の良い日」というのが大安のことです。

六曜の発祥は中国であると言われていますが、日本でも幕末頃から暦に六曜が使われており、古くから冠婚葬祭の日取りを決める時などに使われてきました。

必ず大安の日に行事を行わなければならないということはありません。日取りを決めるための1つの指標となるというだけです。占いなどと同じで、「この日は縁起の良い日だから」という言い伝えが、何か行動を起こそうという際に背中を押してくれるのです。大安の日は少し意識して過ごしてみると、何か良いことが舞い込んでくるかもしれませんね!

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

-その他