2

我有一个 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"
4

1 回答 1

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”的任何东西都可以首先以这种方式创建时才有意义。如果您每次都必须自己修改它,只需跳过它并按原样处理即可。

于 2018-01-09T04:07:55.857 回答