機能
csvにn行1列で納められているstringを読み込み、indexとsubstringをメンバーとして追加します。csvデータは以下のような固定長のものを想定しています。
"C:\Users~~~\Desktop\test\test.csv"
string |
---|
58111361 |
44215590 |
44123622 |
23115643 |
注意点
- 使用する際はご使用者の責任でお願いします。
- 自分用のメモですが、何か役に立てば幸いです。
- PowerShellのバージョンが古い場合、Import-Csvに-EncodingパラメタがないのでGet-Content CSVファイル | CovertFrom-CSVを使います。(Import-CSVコマンドレットには、-Encodingパラメタがなく、文字化けする)。
環境
- PSVersion 5.1.16299.251
- Windows 10 Home
手順
- csvを読み込んでstringをNotePropertyとして持つPSObjectを作成する。
- PSObjectにindexを追加する。
- stringから抜きだしたsubstringをPSObjectに追加する。
コード
#csvの格納場所を指定してcsvを読み込む
$csv = Import-Csv "C:\Users\~~~\Desktop\test\test.csv"
#行数を取得する
$csv | Add-Member NoteProperty index 0
for($i = 0; $i -lt ($csv | Measure-Object).Count; $i++){
$csv[$i].index = $i+1
}
function Add-Submember($TargetObject,$MainString,$MemberName,$SubstringStartIndex,$SubstringCount){
#stringのNotePropertyを持つPSCustomObjectから、そのstringの一部を切り出して名前を付けて、NotePropertyとして追加する
#使用例) Add-Submember $csv string age2 1 2 ⇒ $csvのstringの1文字目から2文字を取り出してage2と名付けてNotePropertyに追加
$TargetObject | Add-Member NoteProperty $MemberName 0
for($i = 0; $i -lt ($TargetObject | Measure-Object).Count; $i++){
$TargetObject[$i].$MemberName = $TargetObject[$i].$MainString.ToString().substring($SubstringStartIndex-1,$SubstringCount)
}
}
#stringの1個めからの2文字を抜き出す
Add-Submember $csv string substring 1 2
#stringの3個めからの4文字を抜き出す
Add-Submember $csv string substring2 3 4
#sort(おまけ)
$csv | Sort-Object {[int] $_.substring}
$csv | Sort-Object {[int] $_.substring}, {[int] $_.substring2}
工夫点
- csvデータの操作について、行を追加する方法はググったらすぐ出てきましたが、列を追加する方法はパッと出てこなかったので書いてみました。
課題・問題点
- 今回のやり方では、いったんAdd-memberで0を代入してから、再度for文で数値を代入していますが、あまりスマートではないと感じます。
おわりに
- コメント大歓迎です。
他の参考文献・参考サイト
- 本投稿では触れていませんが、必要な変数が揃った後のデータ処理については、次のサイトが参考になりました。([Powershell]自作オブジェクト作る練習)。