[powershell]csvの特定文字を置換し、置換箇所を赤色にしたhtmlを出力するスクリプト

##########################################################
#郵便番号データから川を含む県を抽出し、県名、市町村名を
#川->山に置換したものをcsvとhtmlで出力するスクリプト。
#htmlは置換箇所を赤色にする
##########################################################

#郵便番号情報をWEBから取得
write-host "郵便番号データ取得"
Invoke-WebRequest "https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip" -OutFile "ken_all.zip"

#データがある場合削除
if (test-path ".\ken_all.csv"){remove-item "ken_all.csv"}

write-host "解凍"
Expand-Archive "ken_all.zip" -DestinationPath ".\"
#解凍前ファイル削除
remove-item  "ken_all.zip"

#CSVデータの読み込み、ヘッダは適当にa~oで設定
write-host "csvのロード取得"
$csv = import-csv -Encoding default -header a,b,c,d,e,f,g,h,I,j,k,l,m,n,o "KEN_ALL.CSV" 

#CSV出力ファイル名
$script:outfile = @()
#HTML出力ファイル名
$script:outfile2 = @()

write-host "csvデータを一件ずつ処理"
$csv | ? {$_.g -like "*川*"}| select g,h |  Sort-Object -Unique g,h | %{
    $r=$_
    $r2=$r | select *  #そのまま渡すと参照渡しになるのでselectをかけている

    #g列(県名)とh(市町村)列をそれぞれ山->川に置換
    $r2.g = $r2.g -replace "川","山"
    $r2.h = $r2.h -replace "川","山"
    $redString = $NUll

    ("g","h") | %{
      #char配列に変換
      $s = ($r.($_)).tochararray()
      $s2 = ($r2.($_)).tochararray()

      #1文字ずつ比較(置換前後で文字数が変わらない前提のロジック)
      (0..($s.length - 1)) | %{
          if ($s[$_] -ne $s2[$_]){
              #差異がある場合<font>タグで赤色にする
              $redString = $redString + "<font color=red>" + $s2[$_] + "</font>"   
          }else{
              $redString = $redString + $s[$_]
          }
      }
      $r2.($_) = $redString
    }

    $script:outfile = $outfile + $r
    $script:outfile2 = $outfile2 + $r2
}

#System.Webクラスロード
[System.Reflection.Assembly]::LoadWithPartialName("System.Web") | out-null
#ConvertTo-Html するとhtml特殊文字がエスケープされるので元の値に戻す
$script:outfile2 | ConvertTo-Html | %{[System.Web.HttpUtility]::HtmlDecode($_) } | out-file "out.html"
#オリジナルデータ内にも特殊文字が含まれる場合は以下のように固定値を置換する
#$script:outfile2 | ConvertTo-Html |
# %{($_.replace("&lt;font color=red&gt;","<font color=red>")).replace("&lt;/font&gt;","</font>") } |
#  out-file "out\out.html"

#CSVに変換
$script:outfile | ConvertTo-csv -NoTypeInformation | out-file -encoding default "out.csv"

出力例

gh
県さぬき市
県綾歌郡綾
県綾歌郡宇多津町
神奈神奈県愛甲郡愛
神奈神奈県愛甲郡清
神奈神奈県綾瀬市
神奈神奈県伊勢原市
神奈神奈県横須賀市
神奈神奈県横浜市旭区
神奈神奈県横浜市磯子区

★ORACLE案件承ります