2018年1月19日 星期五

[PowerShell] [Office] 用 Regular Expression 轉換日期格式 (US/GB)

前日上班的車程中,想起同事偶爾會碰到日期格式(美式/英式)的問題。雖然可以在打開Excel,為資料分列(Text to Columns)時做處理,去指定每列資料讀取時的格式。但想到要指示得人人明白卻不太易,能否有個只需簡單一按的小工具,可以做美式/英式間的格式轉換呢?

Office 中的問題,PowerShell 解決。也學到一些Regular Expression(正則表達式)的運用:
$inputfile = "test.csv"

(Get-Content $inputfile) | 
Foreach-Object {$_ -replace "([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})", '$2/$1/$3'} | 
Set-Content '_output.txt'


部份 Regular Expression 的解釋:
字元/符號 範例 說明 成立例子
一般字元 / 含字母 “/” 的字串 25/12
^ ^A 比對字串開始位置AB
$ C$ 比對字串結束位置 ABC
\e\^2避開特殊字元 e^2
[......] B[aeiou]t 比對 [......] 內的任意字元 Bit
Bot

[0-9] [0-9] 比對0到9的任意字元,另有[a-z]和[A-Z]等用法 9
{n} B{2} 比對{n}前的字元n次,n必為正整數 BB
{n,m} [0-9]{2,4} 比對{n,m}前的字元至少n次但最多m次,n,m均為正整數 01
2389

(x) ([0-9]+)/([0-9]+) 比對 x 並將符合的部分存入一個變數 可比對 “123/45” 中的 “123” 、 “45”, 並將這個比對得到的字串設定至變數 \$1 和 \$2







加入給使用者的簡介部份:
$rePattern = '([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})'
Write-Host "This will do date-format conversion for your AA/BB/CCCC into BB/AA/CCCC,"
Write-Host "Output as '_converted.txt'. Enjoy."
Write-Host ""
$fileRaw = Read-Host -Prompt 'Input your filename (same folder, ever with file extension): '
(Get-Content $fileRaw) | Foreach-Object {$_ -replace $rePattern, '$2/$1/$3'} | Set-Content '_convert.txt'


對這類辦公室日常出現的問題,有時太重技術層面去應對了就算的話,也明白就像是諸侯舞庶人之劍的感覺。 而且,這個日期格式的問題本來已有專案去處理和做了改變,好處是應該可以更完善的解決問題。但世上總有意外或突然的需要,再啟動一個項目的形式,過程往往會快費較長時間,而小修小補就是quick-and-dirty。

再者,參考使用者自己也會用的方法,就好像社區提案的概念,這些方案可能更切合用家的需要。如果能讓人人都有能力和空餘可以做些小創新、小改變,應該對人對己都是好處吧。

沒有留言:

張貼留言