業務備忘録

備忘録です

【PowerShell】CSVを読み込んでJsonファイルとして出力する

2025-03-04 22:38:10 | 日記
Get-ChildItem -Name -File -Recurse | ForEach-Object {
    If( $_.EndsWith('csv')){
        $Header = 'prefecture','prefectureName', 'cityCode', 'city', 'aliasCode', 'alias', 'latitude', 'longitude', 'sourceCode', 'aliasDivCode'
        Import-Csv  -Path $_ -Delimiter "," -Header $Header  -Encoding oem |
        Select-Object -Skip 1 |
        ForEach-Object{  
        Add-Member -InputObject $_ -NotePropertyName "geo" -NotePropertyValue @([Double]::Parse($_.longitude), [Double]::Parse($_.latitude))
        Write-Output((ConvertTo-Json $_ ) + ',') | Out-File -Encoding utf8 -Append -FilePath 'C:\scripts\result\geo.json'
        $json
        }
    }
}

個人開発で国土地理院の位置参照情報を読み込む必要があったのですが、json形式にして取り込む必要がありました。
PowerShell芸の磨きがてらサクッと書いてみました。

Import-Csv  -Path $_ -Delimiter "," -Header $Header  -Encoding oem |

フォルダ配下のCSVファイルをパイプでつないで、CSVとして読み込みます。-Encodingにoemを指定すると、SJISのファイルを読み込めます。

        Select-Object -Skip 1

PowerShellでImport-Csvを使用すると一行目は自動的にヘッダとして読み込まれますが、ヘッダ名をカスタムするために一行目を読み飛ばさせます。

        Add-Member -InputObject $_ -NotePropertyName "geo" -NotePropertyValue @([Double]::Parse($_.longitude), [Double]::Parse($_.latitude))

経度・緯度情報を配列に格納するためにオブジェクトにプロパティを追加しています。文字列をパースするために[Double]::parseなどと.Netのクラスの静的メソッドを呼び出します。
.Netの機能を使えるとかPowerShell最強すぎませんか?