gpt4 book ai didi

powershell - 在Powershell中读取具有可变列数的CSV

转载 作者:行者123 更新时间:2023-12-02 23:22:04 25 4
gpt4 key购买 nike

我有一个包含用户名的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"

最佳答案

好吧,问题在于您所拥有的实际上不是(正确的)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”的任何方法都可以首先创建时才有意义。如果您每次必须自己修改它,只需跳过此步骤并按原样对其进行处理。

关于powershell - 在Powershell中读取具有可变列数的CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48161102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com