【问题标题】:Sort-Object and Integers排序对象和整数
【发布时间】:2013-02-23 12:19:53
【问题描述】:

我正在尝试用 CSV 文件中的数字对列进行排序。但不知何故,它不起作用。 CSV 示例:

Orange;65
Red;160
Green;140
White;110
Purple;85

这是我尝试过的一段代码:

$csv = Import-Csv -Header "Color", "Number" -delimiter ';' data.csv
$csv | Sort-Object Number

这给了我以下输出:

Color                Number
-----                ------
White                110
Green                140
Red                  160
Orange               65
Purple               85

显然顺序不对。有人可以解释一下如何解决这个问题吗?

【问题讨论】:

    标签: sorting powershell


    【解决方案1】:

    Import-CSV 默认将 csv 列导入为strings。您需要将其转换为int,然后才能按值排序,而不是“按字母顺序”。例如:

    $csv = Import-Csv -Header "Color", "Number" -delimiter ';' data.csv
    $csv | % { $_.Number = [int]$_.Number }
    $csv | Sort-Object Number
    
    Color  Number
    -----  ------
    Orange     65
    Purple     85
    White     110
    Green     140
    Red       160
    

    作为替代方案,您可以在排序时强制转换,如下所示:

    $csv = Import-Csv -Header "Color", "Number" -delimiter ';' data.csv
    $csv | Sort-Object @{e={$_.Number -as [int]}}
    

    甚至更短的$csv | Sort-Object { [int]$_.Number }

    【讨论】:

    • 干杯伙伴搞定了:)
    • 您能否解释一下,从您的选择中,@{e= 是什么意思?特别是'e'。不好意思打扰了,我还在学习中:)
    • 表达式。它是您用来在 powershell 中指定属性的东西。在select-object 中创建自定义字段的示例:select-object @{name="displayedname";expression={code to produce value using ex $_.property etc.} }Sort-Object 不需要列名来排序,所以我只使用了表达式。
    • 阅读更多关于“计算属性”的信息:technet.microsoft.com/en-us/library/ff730948.aspx
    • 我花了很长时间才找到一个演员作为排序示例。希望这是在 TechNet 上! (不仅仅是字符串表达式示例)谢谢!
    猜你喜欢
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多