概要
powershelで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("<font color=red>","<font color=red>")).replace("</font>","</font>") } |
# out-file "out\out.html"
#CSVに変換
$script:outfile | ConvertTo-csv -NoTypeInformation | out-file -encoding default "out.csv"
出力例
g | h |
---|---|
香山県 | 香山県さぬき市 |
香山県 | 香山県綾歌郡綾山町 |
香山県 | 香山県綾歌郡宇多津町 |
神奈山県 | 神奈山県愛甲郡愛山町 |
神奈山県 | 神奈山県愛甲郡清山村 |
神奈山県 | 神奈山県綾瀬市 |
神奈山県 | 神奈山県伊勢原市 |
神奈山県 | 神奈山県横須賀市 |
神奈山県 | 神奈山県横浜市旭区 |
神奈山県 | 神奈山県横浜市磯子区 |