その他

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

投稿日:2020年8月7日 更新日:

スポンサーリンク

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

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

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

次の記事の「bookmarks_YYYY_MM_DD.html」ファイルと同じファイルを使います。

no image
複数行のテキストファイルを1行にする。bat、vbs(Scripting.FileSystemObject、ADODB.Stream)[No41]
複数行あるテキストファイルを読み込んで、別のファイル(新しいファイル)に1行に変換して出力するプログラムを紹介します。 ここでは次の3つの方法を紹介しますが、おすすめは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の場合です。

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

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

スポンサーリンク

タグ

-その他

© 2021 BookALittle