PowershellでCSVを読み込んで配列に入れたいんだけどさ

2021-1-9 - 読み終える時間: 2 分

やってみると難しい

何がしたいかっていうと、AWS EC2で使うボリューム情報をCSVに書いておいて、サイズやデバイス名ごとに配列に入れたいのです。

個人的に今回肝だったのが New-Object System.Collections.ArrayList これと if ( $_ -like "" )

サンプルコード

# array sample

# MADEBY zin@alterworks.tokyo
# DATE   2021-01-09
# Charset Shift_JIS

Set-Location -path $PSScriptRoot

$arrtexts = Get-ChildItem array-*.txt
###### array-01.txt ######
#i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18,i19,i20
#sv-test001,C,12,xvdd,gp2,D,5,xvde,gp2,T,6,xvdf,gp2
##########################

foreach ($g in $arrtexts) {
    $arr_param = Import-Csv -Path $g -Encoding oem -Delimiter ","
    $arr_letters = New-Object System.Collections.ArrayList
    $arr_letter = @($arr_param.i1,$arr_param.i5,$arr_param.i9,$arr_param.i13,$arr_param.i17)
    echo $arr_letter
    echo $arr_letter.Count

    $arr_letter | ForEach-Object{
        if ( $_ -like "" ) {
            echo Empty
        } else {
            echo --- $_
            $arr_letters += $_
        }
    }
    echo "view $arr_letters"
    echo $arr_letters.Count

    $arr_device = @($arr_param.i3,$arr_param.i7,$arr_param.i11,$arr_param.i15,$arr_param.i19)
    $arr_device | ForEach-Object{
        if ( $_ -like "" ) {
            echo Empty
        } else {
            echo --- $_
            $arr_devices += $_
        }
    }
    echo "view $arr_devices"
    echo $arr_devices.Count
}

出力サンプル

C
D
T
5
---
C
---
D
---
T
Empty
Empty
view C D T
3
---
xvdd
---
xvde
---
xvdf
Empty
Empty
view xvddxvdexvdf
1

New-Object System.Collections.ArrayList しないと += した値が繋がってしまう。これが難解だった。 あと if ( $_ -eq "" ) これがダメ(マッチせずに空の値もカウントされてしまう)だった。

難しいね。


今日はここまで