こちらの PowerShell のサンプルで、EDM のデータ アップロード用の CSV ファイルを事前処理し、全角の英数字・記号を半角に変換することを目的に、半角カナを全角カナに変換します。変換元ファイルは、BOM 付き UTF-8、UTF-16 LE、UTF-16 BE のいずれかである必要があり、BOM なし UTF-8 は NG です。既定のファイル出力結果は、UTF-16 LE になります。
以下のサンプルは Normalize メソッドを利用して行ごとに一括正規化します。
$source="E:\WorkData\Comp\EDM_Test\DB\EDM_CustomerDB.csv"
$target="E:\WorkData\Comp\EDM_Test\DB\EDM_CustomerDB_c.csv"
$output=@()
$lines=Get-Content $source
foreach($line in $lines){
$output+=$line.Normalize([System.Text.NormalizationForm]::FormKC)
}
$output|out-file $target
ABCabc
ABCabc
03-3333-3333
03-3333-3333
品川 駅
品川 駅
#$%&
#$%&
アイウエオ
ァィゥェォ
ァィゥェォ
パピプペポ
パピプペポ
ダヂヅデド
ダヂヅデド
ャュョ
ャュョ
ABCabc
ABCabc
03-3333-3333
03-3333-3333
品川 駅
品川 駅
#$%&
#$%&
アイウエオ
ァィゥェォ
ァィゥェォ
パピプペポ
パピプペポ
ダヂヅデド
ダヂヅデド
ャュョ
ャュョ
以下のサンプルは愚直に 1 文字 1 文字置き換えるコードの例です。ただし、こちらの場合は、半角カナを考慮していません。半角カナを置き換える場合、濁音・半濁音が独立した文字となっており、2 文字 -> 1 文字の置換となるため、実装の工夫が必要です。
$source="E:\WorkData\Comp\EDM_Test\DB\EDM_CustomerDB.csv"
$target="E:\WorkData\Comp\EDM_Test\DB\EDM_CustomerDB_c.csv"
function ConvertTo-SingleBytes($str){
$chars=$str.ToCharArray()
$out = [char[]]::new($str.Length)
$count=0
foreach($char in $chars){
$out[$count]=switch -CaseSensitive($char){
'1' {'1';break}
'2' {'2';break}
'3' {'3';break}
'4' {'4';break}
'5' {'5';break}
'6' {'6';break}
'7' {'7';break}
'8' {'8';break}
'9' {'9';break}
'0' {'0';break}
' ' {' ';break}
'A' {'A';break}
'B' {'B';break}
'C' {'C';break}
'D' {'D';break}
'E' {'E';break}
'F' {'F';break}
'G' {'G';break}
'H' {'H';break}
'I' {'I';break}
'J' {'J';break}
'K' {'K';break}
'L' {'L';break}
'M' {'M';break}
'N' {'N';break}
'O' {'O';break}
'P' {'P';break}
'Q' {'Q';break}
'R' {'R';break}
'S' {'S';break}
'T' {'T';break}
'U' {'U';break}
'V' {'V';break}
'W' {'W';break}
'X' {'X';break}
'Y' {'Y';break}
'Z' {'Z';break}
'a' {'a';break}
'b' {'b';break}
'c' {'c';break}
'd' {'d';break}
'e' {'e';break}
'f' {'f';break}
'g' {'g';break}
'h' {'h';break}
'i' {'i';break}
'j' {'j';break}
'k' {'k';break}
'l' {'l';break}
'm' {'m';break}
'n' {'n';break}
'o' {'o';break}
'p' {'p';break}
'q' {'q';break}
'r' {'r';break}
's' {'s';break}
't' {'t';break}
'u' {'u';break}
'v' {'v';break}
'w' {'w';break}
'x' {'x';break}
'w' {'y';break}
'z' {'z';break}
'!' {'!';break}
'#' {'#';break}
'$' {'$';break}
'%' {'%';break}
'&' {'&';break}
'^' {'^';break}
'¥' {'\';break}
'@' {'@';break}
';' {';';break}
':' {':';break}
',' {',';break}
'.' {'.';break}
'/' {'/';break}
'=' {'=';break}
'~' {'~';break}
'|' {'|';break}
'‘' {'`';break}
'{' {'{';break}
'+' {'+';break}
'*' {'*';break}
'}' {'}';break}
'<' {'<';break}
'>' {'>';break}
'?' {'?';break}
'_' {'_';break}
'﹣' {'-';break}
'-' {'-';break}
default {$char}
}
$count++
}
return [String]::new($out)
}
$output=@()
$lines=Get-Content $source
foreach($line in $lines){
$output+=ConvertTo-SingleBytes $line
}
$output|out-file $target
ABCabc
ABCabc
03-3333-3333
03-3333-3333
品川 駅
品川 駅
#$%&
#$%&
アイウエオ
ァィゥェォ
ァィゥェォ
パピプペポ
パピプペポ
ダヂヅデド
ダヂヅデド
ャュョ
ャュョ
ABCabc
ABCabc
03-3333-3333
03-3333-3333
品川 駅
品川 駅
#$%&
#$%&
アイウエオ
ァィゥェォ
ァィゥェォ
パピプペポ
パピプペポ
ダヂヅデド
ダヂヅデド
ャュョ
ャュョ