見出し画像

【ツール】AIに突っ込む前にメールやドキュメントから不要な情報を削除するためのテキスト処理ツール その②

前回のツールの改良版

 
メールを処理するのであれば任意の文字の削除と置き換え
記号の削除があるほうがいいのかなということで追加したものです。

削除する記号などはスクリプトを変更して利用してください。

追加した機能

  • 最前面表示

  • 置き換え機能

  • 任意の言葉の削除

  • 記号削除

  • 先頭スペース

  • トリミング

  • 挨拶パターン追加

Add-Type -AssemblyName PresentationFramework

# GUIの作成
$window = New-Object Windows.Window
$window.Title = "テキスト処理ツール"
$window.Width = 800
$window.Height = 800
$window.Topmost = $true # 常に最前面に表示

$grid = New-Object Windows.Controls.Grid
$column1 = New-Object Windows.Controls.ColumnDefinition
$column2 = New-Object Windows.Controls.ColumnDefinition
$column1.Width = New-Object Windows.GridLength(1, [Windows.GridUnitType]::Star)
$column2.Width = New-Object Windows.GridLength(1, [Windows.GridUnitType]::Star)
$grid.ColumnDefinitions.Add($column1)
$grid.ColumnDefinitions.Add($column2)

$row1 = New-Object Windows.Controls.RowDefinition
$row2 = New-Object Windows.Controls.RowDefinition
$row3 = New-Object Windows.Controls.RowDefinition
$row4 = New-Object Windows.Controls.RowDefinition
$row1.Height = New-Object Windows.GridLength(1, [Windows.GridUnitType]::Star)
$row2.Height = New-Object Windows.GridLength(1, [Windows.GridUnitType]::Auto)
$row3.Height = New-Object Windows.GridLength(1, [Windows.GridUnitType]::Auto)
$row4.Height = New-Object Windows.GridLength(2, [Windows.GridUnitType]::Auto)
$grid.RowDefinitions.Add($row1)
$grid.RowDefinitions.Add($row2)
$grid.RowDefinitions.Add($row3)
$grid.RowDefinitions.Add($row4)

# テキストボックスの設定
$inputTextBox = New-Object Windows.Controls.TextBox
$inputTextBox.VerticalScrollBarVisibility = 'Visible'
$inputTextBox.TextWrapping = 'Wrap'
$inputTextBox.AcceptsReturn = $true

$outputTextBox = New-Object Windows.Controls.TextBox
$outputTextBox.IsReadOnly = $true
$outputTextBox.VerticalScrollBarVisibility = 'Visible'
$outputTextBox.TextWrapping = 'Wrap'

$grid.Children.Add($inputTextBox)
$grid.Children.Add($outputTextBox)

# オプションのチェックボックス
$checkboxPanel = New-Object Windows.Controls.StackPanel
$checkboxPanel.Orientation = 'Vertical'
$checkboxPanel.HorizontalAlignment = 'Left'

# テキスト処理オプション用のチェックボックスを追加
$options = @("メールアドレス", "電話番号", "内線番号", "FAX番号", "URL", "〒から始まる行", "都道府県から始まる住所", "メールの冒頭の挨拶文", "パスワード", "署名", "2行以上の改行", "記号", "先頭のスペース", "トリミング")
foreach ($option in $options) {
    $checkbox = New-Object Windows.Controls.CheckBox
    $checkbox.Content = $option
    $checkbox.IsChecked = $true
    $checkboxPanel.Children.Add($checkbox)
}

# 文字列削除オプションを別のStackPanelに移動
$removalOptionsPanel = New-Object Windows.Controls.StackPanel  
$removalOptionsPanel.Orientation = 'Vertical'

$labelForRemovingText = New-Object Windows.Controls.Label
$labelForRemovingText.Content = "任意の文字列削除:"
$removalOptionsPanel.Children.Add($labelForRemovingText)

$customTextToRemoveTextBoxes = 1..3 | ForEach-Object {
    $textBox = New-Object Windows.Controls.TextBox
    $textBox.Margin = New-Object Windows.Thickness(10,0,10,5)
    $textBox.Height = 20
    $textBox.Width = 200
    $removalOptionsPanel.Children.Add($textBox)
    $textBox
}

# 文字列を置き換える機能のラベル
$labelForReplacingText = New-Object Windows.Controls.Label
$labelForReplacingText.Content = "任意の文字列置き換え:"
$removalOptionsPanel.Children.Add($labelForReplacingText)

# 文字列を置き換えるためのテキストボックスを2組追加
$replaceFromTextBoxes = 1..2 | ForEach-Object {
    # "前" ラベルを作成
    $fromLabel = New-Object Windows.Controls.Label
    $fromLabel.Content = "前"
    $fromLabel.Margin = New-Object Windows.Thickness(10,0,0,5)

    # "From" テキストボックスを作成
    $fromTextBox = New-Object Windows.Controls.TextBox
    $fromTextBox.Margin = New-Object Windows.Thickness(5,0,0,5)
    $fromTextBox.Height = 20
    $fromTextBox.Width = 90

    # "後" ラベルを作成
    $toLabel = New-Object Windows.Controls.Label
    $toLabel.Content = "後"
    $toLabel.Margin = New-Object Windows.Thickness(10,0,0,5)

    # "To" テキストボックスを作成
    $toTextBox = New-Object Windows.Controls.TextBox
    $toTextBox.Margin = New-Object Windows.Thickness(5,0,10,5)
    $toTextBox.Height = 20
    $toTextBox.Width = 90

    # ラベルとテキストボックスを$removalOptionsPanelに追加
    $removalOptionsPanel.Children.Add($fromLabel)
    $removalOptionsPanel.Children.Add($fromTextBox)
    $removalOptionsPanel.Children.Add($toLabel)
    $removalOptionsPanel.Children.Add($toTextBox)

    @{ "From" = $fromTextBox; "To" = $toTextBox }
}


# テキスト処理関数の定義
function Process-Text {
    param (
        [string]$text,
        [hashtable]$options,
        [string[]]$customTextsToRemove,
        [array]$replacePairs
    )
    
    # テキスト処理のロジック
    if ($options["メールアドレス"]) {
        $text = $text -replace '\b(?:Email:?|メールアドレス:?)?[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', ''
    }
    if ($options["電話番号"]) {
        $text = $text -replace '\b(?:TEL:?)?\d{2,5}-\d{3,4}-\d{3,4}\b', ''
    }
    if ($options["内線番号"]) {
        $text = $text -replace '\b(?:内線:?)?\d{2}-\d{4}\b', ''
    }
    if ($options["FAX番号"]) {
        $text = $text -replace '\b(?:FAX:?)?\d{2,4}-\d{2,4}-\d{4}\b', ''
    }
    if ($options["URL"]) {
        $text = $text -replace '\b(?:URL:?)?https?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))', ''
    }
    if ($options["〒から始まる行"]) {
        $text = $text -replace '(?m)^\s*〒.+$', ''
    }
    if ($options["都道府県から始まる住所"]) {
        $prefectures = '北海道|青森県|岩手県|宮城県|秋田県|山形県|福島県|茨城県|栃木県|群馬県|埼玉県|千葉県|東京都|神奈川県|新潟県|富山県|石川県|福井県|山梨県|長野県|岐阜県|静岡県|愛知県|三重県|滋賀県|京都府|大阪府|兵庫県|奈良県|和歌山県|鳥取県|島根県|岡山県|広島県|山口県|徳島県|香川県|愛媛県|高知県|福岡県|佐賀県|長崎県|熊本県|大分県|宮崎県|鹿児島県|沖縄県'
        $text = $text -replace "(?m)^.*($prefectures).*?$", ''
    }
    if ($options["メールの冒頭の挨拶文"]) {
        $text = $text -replace '(?m)^(お世話になっております。|いつも大変お世話になっております。|お忙しいところ恐れ入りますが、|平素より格別のお引き立てを賜り、厚く御礼申し上げます。|この度はご連絡いただき、誠にありがとうございます。|ご多忙の折、恐縮ですが、|前略、天候も変わりやすい季節となりましたが、|拝啓、時下ますますご清祥のこととお慶び申し上げます。|早速ですが、|お世話になっております。|大変お世話になっております。|いつもお世話になっています。|初めての挨拶|初めまして。|初めてメールをお送りします。|久しぶりの挨拶|ご無沙汰しております。|大変ご無沙汰しております。|返信時の挨拶|早速のご返信ありがとうございます。|メールをお送りくださいましてありがとうございます。|かしこまった挨拶).*$', ''
    }

    if ($options["パスワード"]) {
        $text = $text -replace '\b(?:password|pass|pw|パスワード)[^\w]*[::]?[^\w]*\w+', ''
    }

    if ($options["署名"]) {
        $text = $text -replace '(?m)^--.*$', ''
        $text = $text -replace '(?m)^(敬具|よろしくお願いします|宜しくお願い致します|Best regards|Sincerely).*$', ''
    }

    if ($options["2行以上の改行"]) {
        $text = $text -replace '(\r?\n){2,}', "`r`n"
    }

    if ($options["記号"]) {
        $symbols = '━┃┃*○●◎▲△▼▽⊿☆★□■◇◆〇|∥∞∽∝♂♀†‡♭♪┏┓┗ ┛┳┻╋'
        $text = $text -replace "[$symbols]", ''
    }

    if ($options["先頭のスペース"]) {
        $text = $text -replace '^[\s ]+', ''
    }

    if ($options["トリミング"]) {
        $text = $text -replace '(?m)^[\s ]+|[\s ]+$', ''
    }

     # 任意の文字列を削除
     foreach ($customText in $customTextsToRemove) {
        if ([string]::IsNullOrWhiteSpace($customText) -eq $false) {
            $text = $text -replace [regex]::Escape($customText), ''
        }
    }

    # 任意の文字列を置き換え
    foreach ($pair in $replacePairs) {
        if ([string]::IsNullOrWhiteSpace($pair.From) -eq $false -and [string]::IsNullOrWhiteSpace($pair.To) -eq $false) {
            $text = $text -replace [regex]::Escape($pair.From), $pair.To
        }
    }
    
    return $text
}

# 処理ボタン
$processButton = New-Object Windows.Controls.Button
$processButton.Content = "処理"
$processButton.Add_Click({
    $selectedOptions = @{}
    foreach ($child in $checkboxPanel.Children) {
        if ($child -is [Windows.Controls.CheckBox]) {
            $selectedOptions[$child.Content] = $child.IsChecked
        }
    }

    $customTextsToRemove = $customTextToRemoveTextBoxes | ForEach-Object { $_.Text }
    $replacePairs = $replaceFromTextBoxes | ForEach-Object { @{ "From" = $_.From.Text; "To" = $_.To.Text } }

    $outputTextBox.Text = Process-Text -text $inputTextBox.Text -options $selectedOptions -customTextsToRemove $customTextsToRemove -replacePairs $replacePairs
})

$grid.Children.Add($checkboxPanel)
$grid.Children.Add($removalOptionsPanel)
$grid.Children.Add($processButton)

# コントロールの配置
[System.Windows.Controls.Grid]::SetColumn($inputTextBox, 0)
[System.Windows.Controls.Grid]::SetRow($inputTextBox, 0)
[System.Windows.Controls.Grid]::SetColumn($outputTextBox, 1)
[System.Windows.Controls.Grid]::SetRow($outputTextBox, 0)
[System.Windows.Controls.Grid]::SetColumn($checkboxPanel, 0)
[System.Windows.Controls.Grid]::SetRow($checkboxPanel, 1)
[System.Windows.Controls.Grid]::SetColumn($removalOptionsPanel, 1) 
[System.Windows.Controls.Grid]::SetRow($removalOptionsPanel, 1)
[System.Windows.Controls.Grid]::SetColumn($processButton, 0)
[System.Windows.Controls.Grid]::SetRow($processButton, 3)
[System.Windows.Controls.Grid]::SetColumnSpan($processButton, 2)

$window.Content = $grid
$window.ShowDialog()

この記事が気に入ったらサポートをしてみませんか?