【问题标题】:Read a CSV in powershell with a variable number of columns在 powershell 中读取具有可变列数的 CSV
【发布时间】:2018-06-18 01:40:28
【问题描述】:

我有一个 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 读取数据后对其进行解析,但如果可以的话,我想避免这种情况。
  • 您不必使用 Import-Csv。您始终可以使用 Get-Content,并一次处理每一行。

标签: powershell import-csv


【解决方案1】:

嗯,问题是您所拥有的并不是(正确的)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”的任何东西都可以首先以这种方式创建时,第二种方式才有意义。如果每次都得自己修改,直接跳过就行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 2022-08-19
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多