我有一个包含用户名的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"
答案 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"首先可以用这种方式创建它。如果你每次都必须自己修改它,只需跳过它并按原样处理它。