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