【问题标题】:Sorting using the sort object in PowerShell part 2使用 PowerShell 第 2 部分中的排序对象进行排序
【发布时间】:2016-08-11 14:28:24
【问题描述】:

我仍在尝试将包含一些数据的 CSV 文件(以逗号分隔)中的重复项动态排序和删除到新的 CSV 文件中。在 -Property $SortByColNames 的堆栈溢出成员之一的帮助下获得了进一步的帮助,但现在我的问题出在 ForEach 部分。如果我将 ForEach 的编号部分硬编码在大括号中并在“-f”之后将列名硬编码,我就能让它工作,但是如果我尝试将这两者变成从函数中的参数传递的变量,它会给我一个包含物理的 CSV 文件-f 部分的字符串。

我尝试将 $ShowColsByNumber 设为字符串和对象变量,并将 $ColumnValueFormat 设为字符串和对象。都不行。

谁能帮忙。

下面是有效的代码,后面是无效的代码:

作品

[string] $Source = 'e:\Temp\DataFromSkywardEdited.csv';
[string] $Destination = 'e:\Temp\DataFromSkywardRD.csv';
[object] $SortByColNames = 'LastName','FirstName';

Get-Content $Source |
      ConvertFrom-Csv | 
    Sort -Property $SortByColNames -Unique |
    ForEach {"{0},{1},{2},{3},{4},{5},{6},{7},{8}" -f $_.EmployeeID.Trim(), $_.FirstName.Trim(), $_.LastName.Trim(), $_.Location.Trim(), $_.Department.Trim(), $_.TelephoneNo.Trim(), $_.Email.Trim(), $_.EmpTypeCode.Trim(), $_.EmployeeTypeDescription.Trim()} | 
        Add-Content $Destination

不工作

[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 -Property $SortByColNames -Unique |
                ForEach {$ShowColsByNumber -f $ColumnValueFormat} | 
                    Add-Content $Destination;

【问题讨论】:

  • 您的替换将不起作用,因为您正在为“$_.EmployeeID.Trim()”插入文字字符串。这不会被调用和扩展以添加到您的字符串中。

标签: powershell


【解决方案1】:

这应该可行。

[String[]]$ColumnValueFormat = 'EmployeeID', 'FirstName', 'LastName' # Truncated, example.

Get-Content $Source |
    ConvertFrom-Csv -Delimiter $Delimiter |
    Sort-Object -Property $SortByColNames -Unique |
    Select-Object $ColumnValueFormat |
    ForEach-Object {
        $_.PSObject.Properties.Value.Trim() -join ','
    }

使用原始值需要这样的东西。每次循环时都必须执行数组中的每个值。其中一种方法是使用 Invoke-Expression,这并不是真正的好做法。

[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: ForEach {$ShowColsByNumber -f $ColumnValueFormat} |带有以下内容:Select-Object 及其在大括号中的 ForEach-Object,但它抱怨 $ShowColsByNumber。我该怎么办?
  • Sort-Object 已经在此示例中为您排序值,ForEach-Object 中的部分正在处理修剪。如果没有一些相当混乱的工作将$ColumnValueFormat 中的每个值转换为ScriptBlock,您就无法使用您拥有的版本。让我给你看。
  • 对不起,我的意思是 Select-Object 正在对值进行排序(对列进行排序,而不是对行进行排序)。无论如何,我已经添加了一种让原件按原样工作的可能方法。我不认为使用 Invoke-Expression 是一种好的做法,更像是最后的手段。
  • 效果很好。谢谢,你太棒了 :-) 如果你有时间和/或想添加评论,如果不使用 Invoke-Expression,你将如何做到这一点,我们将不胜感激。再次感谢。
  • 嗨,克里斯。还有一个问题。您将如何以数字方式指定 $ColumnValueFormat ?因此替换为:[object] $ColumnValueFormat = '$_.EmployeeID.Trim()', FirstName.Trim()'... 类似于:[object] $ColumnValueFormat = '$_.[0]。 Trim()', '$_.[1].Trim()' 可能存在没有列标题的 CSV 文件。
猜你喜欢
  • 2016-12-18
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2020-07-21
  • 1970-01-01
相关资源
最近更新 更多