在 powershell 中读取列数可变的 CSV

Read a CSV in powershell with a variable number of columns

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

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

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

不幸的是,下面这行只获取了第一个成员资格而忽略了该行的其余部分。

$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 文件中数据的 "rest" 括在引号中来获得第一个结果,但这并不是最好的答案:

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

好吧,问题是您所拥有的并不是真正的(正确的)CSV。 CSV 格式不支持该表示法。

您可以 "roll your own" 自己处理文件,如下所示:

$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" 的任何东西都可以首先以这种方式创建时才有意义。如果每次都要自己修改,就跳过这个,照原样处理。