【问题标题】:Sorting using the sort object in PowerShell part 3使用 PowerShell 第 3 部分中的排序对象进行排序
【发布时间】:2016-12-18 18:35:55
【问题描述】:

从下面的第 2 部分示例中稍微更改了我的代码,但由于 stackoverflow 中的成员,我的第 2 部分示例效果很好。

[string] $Source = 'e:\Temp\DataFromSkywardEdited.csv';
[string] $Destination = 'e:\Temp\DataFromSkywardRD.csv';
[object] $SortByColNames = 'LastName','FirstName';
[string] $ShowColsByNumber = "{0},{1},{2},{3},{4},{5},{6},{7},{8}";
[object] $ColumnValueFormat = '$_.EmployeeID.Trim()', '$_.FirstName.Trim()', '$_.LastName.Trim()', '$_.Location.Trim()', '$_.Department.Trim()', '$_.TelephoneNo.Trim()', '$_.Email.Trim()', '$_.EmpTypeCode.Trim()', '$_.EmployeeTypeDescription.Trim()';

Get-Content $Source |
    ConvertFrom-Csv -Delimiter $Delimiter | 
    Sort-Object -Property $SortByColNames -Unique |
    ForEach-Object {
        # Each of the values in $ColumnValueFormat must be executed to get the property from the loop variable ($_). 
        $values = foreach ($value in $ColumnValueFormat) {
            Invoke-Expression $value
        }
        # Then the values can be passed in as an argument for the format operator.
        $ShowColsByNumber -f $values
    } | 
    Add-Content $Destination

如何使 $ColumnValueFormat 用数字而不是列名来表示?

所以而不是:

[object] $ColumnValueFormat = '$_.EmployeeID.Trim()', '$_.FirstName.Trim()', '$_.LastName.Trim()', '$_.Location.Trim()', '$_.Department.Trim()', '$_.TelephoneNo.Trim()', '$_.Email.Trim()', '$_.EmpTypeCode.Trim()', '$_.EmployeeTypeDescription.Trim()';

类似于:

[object] $ColumnValueFormat = '$_.[0].Trim()', '$_.[1].Trim()', '$_.[2].Trim()', '$_.[3].Trim()', '$_.[4].Trim()', '$_.[5].Trim()', '$_.[6].Trim()', '$_.[7].Trim()', '$_.[8].Trim()';

【问题讨论】:

    标签: powershell


    【解决方案1】:

    这看起来确实像您这样做很困难,但是要直接回答您的问题,您只需删除括号数字之前的句点即可。所以...

    [object] $ColumnValueFormat = '$_[0].Trim()', '$_[1].Trim()', '$_[2].Trim()', '$_[3].Trim()', '$_[4].Trim()', '$_[5].Trim()', '$_[6].Trim()', '$_.[7]Trim()', '$_[8].Trim()';
    

    【讨论】:

    • 太棒了。谢谢TheMadTechnician。这就是我一直在寻找的。等我下班后我会试一试,然后告诉你进展如何。
    • 工作出色。谢谢TheMadTechnician。虽然我有另一个问题使它更动态。我已经发布了另一个问题。希望您或其他人能够提供帮助。再次感谢。 :-)
    【解决方案2】:

    如何让$ColumnValueFormat 用数字而不是列名来表示?

    你不会的。只是……不。

    要修剪 CSV 的字段,您只需执行 this 之类的操作:

    $csv = Import-Csv $Source
    
    foreach ($record in $csv) {
      foreach ($property in $record.PSObject.Properties) {
        $property.Value = $property.Value.Trim()
      }
    }
    
    $csv | Sort-Object $SortByColNames -Unique | Export-Csv $Destination
    

    如果您必须以不同的方式处理不同的字段,您可以使用 switch 语句来区分这些值:

    $property.Value = switch ($property.Name) {
      'foo' { ... }
      'bar' { ... }
      ...
    }
    

    通过calculated properties修改字段:

    Import-Csv $Source |
      Select-Object @{n='EmployeeID';e={$_.EmployeeID.Trim()},
        @{n='FirstName';e={...},
        ... |
      Sort-Object $SortByColNames -Unique |
      Export-Csv $Destination
    

    或通过New-Object重新创建记录:

    Import-Csv $Source |
      ForEach-Object {
        New-Object -Type PSObject -Property @{
          'EmployeeID' = $_.EmployeeID.Trim()
          'FirstName'  = ...
          ...
        }
      } |
      Sort-Object $SortByColNames -Unique |
      Export-Csv $Destination
    

    在 PowerShell v3 和更新版本中,您甚至可以使用 type accelerator [ordered] 以特定顺序创建属性,如下所示:

    $props = [ordered]@{
      'EmployeeID' = $_.EmployeeID.Trim()
      'FirstName'  = ...
      ...
    }
    New-Object -Type PSObject -Property $props
    

    或者像这样:

    [PSObject][ordered]@{
      'EmployeeID' = $_.EmployeeID.Trim()
      'FirstName'  = ...
      ...
    }
    

    【讨论】:

    • 感谢 Ansgar Wiechers 花费您的时间和知识做出回应。我将来会使用它。对于这个解决方案,我已经在使用通过管道传输到 Sort-Object 的 Get-Content。如果我使用 Import CSV,我将不得不更改相当多的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多