使用可变数量的列读取powershell中的CSV

时间:2018-01-09 03:39:11

标签: powershell import-csv

我有一个包含用户名的CSV,然后是其余记录的一个或多个值。文件中没有标题。

joe.user,Accounting-SG,CustomerService-SG,MidwestRegion-SG
frank.user,Accounting-SG,EastRegion-SG

我想将文件读入一个powershell对象,其中Username属性设置为第一列,Membership属性设置为行的其余部分(包括逗号)或理想情况下,字符串数组每个元素包含一个成员资格值。

不幸的是,以下行只抓取第一个成员资格并忽略该行的其余部分。

$memberships = Import-Csv -Path C:\temp\values.csv -Header "username", "membership"
@{username=joe.user; membership=Accounting-SG}
@{username=frank.user; membership=Accounting-SG}

我正在寻找其中任何一项产出:

@{username=joe.user; membership=Accounting-SG,CustomerService-SG,MidwestRegion-SG}
@{username=frank.user; membership=Accounting-SG,EastRegion-SG}

@{username=joe.user; membership=string[]}
@{username=frank.user; membership=string[]}

我已经能够通过附上"休息"来获得第一个结果。引号中的csv文件中的数据,但这并不是最好的答案:

joe.user,"Accounting-SG,CustomerService-SG,MidwestRegion-SG"

1 个答案:

答案 0 :(得分:3)

嗯,问题是你所拥有的并不是一个(正确的)CSV。 CSV格式不支持该表示法。

你可以自己推动自己的"并自己处理文件,如下所示:

$memberships = Get-Content -LiteralPath C:\temp\values.csv |
    ForEach-Object -Process {
        $user,$membership = $_.Split(',')
        New-Object -TypeName PSObject -Property @{
            username = $user
            membership = $membership
        }
    }

你可以做一半的事情。使用您的修改,如果组都是引号中的单个字段,请执行以下操作:

$memberships = Import-Csv -Path C:\temp\values.csv -Header "username", "membership" |
    ForEach-Object -Process {
        $_.membership = $_.membership.Split(',')
        $_
    }

第一个示例只是逐行读取文件,在逗号上拆分,然后创建一个具有所需属性的新对象。

第二个示例最初使用Import-Csv创建对象,然后只重置.membership属性(它以字符串形式开始,我们将字符串拆分,使它现在成为一个数组)

第二种方式只有在创造" CSV"首先可以用这种方式创建它。如果你每次都必须自己修改它,只需跳过它并按原样处理它。