【AutoIt】プレビュー&差分ハイライト機能付き・文字列置換ツール

この記事では、筆者が AutoIt で作成し、個人的に使用している実用的なファイル内文字列置換ツールを紹介します。

このツールは、ファイルの中身を置換前と置換後で左右に並べてプレビューできます。さらに、実際に置換された箇所だけが赤色でハイライト表示されるため、一目で変更点を確認できます。

安全なプレビュー機能と、分かりやすい差分表示を備えたスクリプトです。

目次

完成したスクリプトの全コード

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile_x64=Text_Replacement_Preview_Tool.exe
#AutoIt3Wrapper_Res_Description=プレビュー&差分ハイライト機能付き・文字列置換ツール。
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_ProductName=Text_Replacement_Preview_Tool
#AutoIt3Wrapper_Res_ProductVersion=1.0
#AutoIt3Wrapper_Res_CompanyName=©2025 wenbang https://windows-waza.com/
#AutoIt3Wrapper_Res_LegalCopyright=©2025 wenbang https://windows-waza.com/
#AutoIt3Wrapper_Res_LegalTradeMarks=Text_Replacement_Preview_Tool.exe
#AutoIt3Wrapper_Res_Language=1041
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <GuiRichEdit.au3>
#include <MsgBoxConstants.au3>
#include <Color.au3>

Global $g_sOriginalContent = ""
Global $g_sNewContent = ""
Global $g_sFilePath = ""

Local $hGUI = GUICreate("テキスト置換プレビューツール", 800, 600)
GUICtrlCreateLabel("検索する文字列:", 10, 15, 100, 20)
Local $idInput_Find = GUICtrlCreateInput("", 100, 10, 200, 25)
GUICtrlCreateLabel("置換後の文字列:", 320, 15, 100, 20)
Local $idInput_Replace = GUICtrlCreateInput("", 410, 10, 200, 25)
Local $idChk_Case = GUICtrlCreateCheckbox("大文字/小文字を区別しない", 630, 15)
GUICtrlSetState($idChk_Case, $GUI_CHECKED)
GUICtrlCreateLabel("置換前", 10, 45, 100, 20)
Local $idEdit_Before = _GUICtrlRichEdit_Create($hGUI, "", 10, 65, 385, 480, $ES_MULTILINE + $WS_VSCROLL + $ES_READONLY)
Local $aGray[3] = [240, 240, 240]
Local $idEdit_BkColor = _ColorSetCOLORREF($aGray)
_GUICtrlRichEdit_SetBkColor($idEdit_Before, $idEdit_BkColor)
GUICtrlCreateLabel("置換後 (変更箇所が赤色で表示されます)", 405, 45, 300, 20)
Local $idRichEdit_After = _GUICtrlRichEdit_Create($hGUI, "", 405, 65, 385, 480, $ES_MULTILINE + $WS_VSCROLL + $ES_READONLY)
Local $idBtn_Load = GUICtrlCreateButton("ファイルを開く", 10, 555, 150, 35)
Local $idBtn_Replace = GUICtrlCreateButton("プレビュー更新", 170, 555, 150, 35)
Local $idBtn_Save = GUICtrlCreateButton("名前を付けて保存", 330, 555, 150, 35)
GUISetState($idBtn_Save, $GUI_DISABLE)
GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            _GUICtrlRichEdit_Destroy($idRichEdit_After)
            ExitLoop
        Case $idBtn_Load
            _LoadFile()
        Case $idBtn_Replace
            _PerformReplace()
        Case $idBtn_Save
            _SaveFile()
    EndSwitch
WEnd

Exit

Func _LoadFile()
    $g_sFilePath = FileOpenDialog("ファイルを選択", @MyDocumentsDir, "テキストファイル (*.txt;*.ini;*.log)")
    If @error Then Return
    $g_sOriginalContent = FileRead($g_sFilePath)
    _GUICtrlRichEdit_SetText($idEdit_Before, $g_sOriginalContent)
    _GUICtrlRichEdit_SetText($idRichEdit_After, "")
    GUISetState($idBtn_Save, $GUI_DISABLE)
EndFunc   ;==>_LoadFile

; ### 置換とプレビュー更新を行う関数 ###
Func _PerformReplace()
    If $g_sOriginalContent = "" Then Return
    Local $sFind = GUICtrlRead($idInput_Find)
    ; 検索文字列が空の場合はハイライト処理をしない
    If $sFind = "" Then
        _GUICtrlRichEdit_SetText($idRichEdit_After, $g_sOriginalContent)
        Return
    EndIf

    Local $sReplace = GUICtrlRead($idInput_Replace)
    Local $bMatchCase = (GUICtrlRead($idChk_Case) == $GUI_CHECKED)

    ; 置換後のテキスト全体を先に生成しておく
    Local $iCase = 0
    If Not $bMatchCase Then $iCase = 1
    $g_sNewContent = StringReplace($g_sOriginalContent, $sFind, $sReplace, 0, $iCase)

    ; 新しいハイライト処理関数を呼び出す
    _ReplaceAndHighlight($idRichEdit_After, $g_sOriginalContent, $sFind, $sReplace, $bMatchCase)
    GUISetState($idBtn_Save, $GUI_ENABLE)
EndFunc   ;==>_PerformReplace

; ### 置換とハイライトを同時に行う関数 ###
Func _ReplaceAndHighlight($hRichEdit, $sOriginal, $sFind, $sReplace, $bMatchCase)
    ; 最初にリッチエディットをクリア
    _GUICtrlRichEdit_SetText($hRichEdit, "")

    Local $iCase = 0
    If Not $bMatchCase Then $iCase = 1
    Local $iLastPos = 1

    While 1
        ; 1. 元のテキストから、検索文字列を探す
        Local $iFoundPos = StringInStr($sOriginal, $sFind, $iCase, 1, $iLastPos)
        If $iFoundPos = 0 Then ExitLoop ; 見つからなければループ終了

        ; 2. 見つかった場所の直前までの、未処理のテキストを黒色で追加
        _GUICtrlRichEdit_AppendText($hRichEdit, StringMid($sOriginal, $iLastPos, $iFoundPos - $iLastPos))

        ; 3. 置換文字列を赤色で追加
        Local $aRed[3] = [255, 0, 0] ; 赤色をRGB配列で定義
        Local $iColor_BGR = _ColorSetCOLORREF($aRed)
        _GUICtrlRichEdit_SetCharColor($hRichEdit, $iColor_BGR); 色を赤にする
        _GUICtrlRichEdit_AppendText($hRichEdit, $sReplace)
        _GUICtrlRichEdit_SetCharColor($hRichEdit, 0x000000) ; 色を黒に戻す

        ; 4. 次の検索開始位置を更新
        $iLastPos = $iFoundPos + StringLen($sFind)
    WEnd

    ; 5. 最後に残ったテキストを黒色で追加
    _GUICtrlRichEdit_AppendText($hRichEdit, StringMid($sOriginal, $iLastPos))

    _GUICtrlRichEdit_SetSel($hRichEdit, 0, 0)
EndFunc   ;==>_ReplaceAndHighlight

Func _SaveFile()
    Local $sSavePath = FileSaveDialog("名前を付けて保存", @MyDocumentsDir, "テキストファイル (*.txt)", 16, "Replaced_Text.txt")
    If @error Then Return
    Local $sOpenFile = FileOpen($sSavePath, $FO_OVERWRITE)
    If FileWrite($sSavePath, $g_sNewContent) Then
        MsgBox($MB_OK, "成功", "ファイルを保存しました。")
    Else
        MsgBox($MB_ICONERROR, "失敗", "ファイルの保存に失敗しました。")
    EndIf
    FileClose($sOpenFile)
EndFunc   ;==>_SaveFile

自作ソフト一覧・更新情報・自作ソフトの使用について からコンパイルしたファイルをダウンロードできます。

コードの詳しい解説

GUI のレイアウトと主な機能

このツールのGUIは、ユーザーが直感的に操作できるよう設計されています。

  • 左右のプレビュー画面: 左側に元のテキスト、右側に置換後のプレビューが表示されます。右側のプレビューには、文字ごとに色を設定できるリッチエディットコントロールを使用しており、これがハイライト機能の鍵となります。
  • 置換オプション: 検索・置換文字列の入力欄に加え、「大文字/小文字を区別する」チェックボックスを設けることで、より正確な置換が可能です。
  • 操作ボタン: 「ファイルを開く」「プレビュー更新」「名前を付けて保存」の3つのボタンで、安全なファイル操作を実現します。

変更箇所のみをハイライトする

このツールの最も重要な機能が、_ReplaceAndHighlight関数によって実現されています。以前のコードにあった「元から存在する同じ文字列もハイライトしてしまう」というバグを、以下のロジックで解決しています。

  1. StringInStrでループ: StringReplaceで一括置換するのではなく、StringInStrを使い、元のテキストから検索対象の文字列($sFind)の位置を一つずつ探し出します。
  2. マッチ前の部分を追加: 見つかった場所の直前までのテキストは「変更がない」部分なので、そのまま黒色でリッチエディットに追加します。
  3. 置換文字列を赤色で追加: 色を赤に設定し、置換後の文字列($sReplace)をリッチエディットに追加します。そして、すぐに色を黒に戻します。
  4. 検索位置の更新: 次の検索を開始する位置を、今回見つかった文字列の直後にずらして、ループを続けます。

この「元のテキストを分解し、置換箇所だけを着色しながら再構築する」というアプローチにより、実際に置換が発生した箇所だけをピンポイントでハイライトすることが可能になります。

ファイルの読み込みと保存

  • _LoadFile: FileReadでファイルの内容を丸ごと読み込み、左側の「置換前」エディットに表示します。
  • _SaveFile: _PerformReplace関数の中でメモリ上に保持しておいた、置換後の完全なテキスト($g_sNewContent)を、ユーザーが指定した場所にFileWriteで書き出します。元のファイルを直接上書きしないため、安全です。

まとめ

このスクリプトは、GUI、リッチエディットによる高度な書式設定、そして安全なプレビュー機能を組み合わせた、対話的なアプリケーションとなっています。

特に、置換とハイライトを同時に行う _ReplaceAndHighlight 関数のロジックは、他の様々なテキスト処理ツールを作成する上でも応用できる、強力なテクニックです。

  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする


目次