【问题标题】:I can't get PowerShell to cast as int correctly我无法让 PowerShell 正确转换为 int
【发布时间】:2012-05-15 14:35:34
【问题描述】:

我目前正在导入一个CSV 文件,该文件有一列全是数字。我正在尝试将其转换为 int 并且仅提取大于 100 的值。我手动浏览了此 CSV 文件,并且可以确认有三行的值大于 100%。但是,这总是返回 0。我做错了什么?

$percentTooLarge = Import-Csv path\file.csv | Foreach-Object { $_.SumHoldingPercent = $_.SumHoldingPercent -as [int]; $_ } | Where-Object { $_.SumHoldingPercent -gt 100 } | Measure-Object
$numPercentTooLarge = $percentTooLarge.Count

【问题讨论】:

  • 文件中 SumHoldingPercent 的值是多少,'100' 还是 '100%'?
  • 文件 99.99413625、100.0000006、99.9999999 中的一些示例
  • 当我输入时,我假设我的问题是转换为 int,而不是 float
  • 转换为 Int 应该会成功,尽管它会四舍五入您的数字。去掉变量赋值和对Measure-Object的调用,结果如何?
  • 我不知道。我可以告诉你,如果我投射为浮点数,它可以完美运行

标签: loops powershell csv casting


【解决方案1】:

由于比较运算符在 PowerShell 中的工作方式,这应该可以解决问题:

$percentTooLarge = Import-Csv path\file.csv | 
    Where-Object { 100 -lt $_.SumHoldingPercent} | 
    Measure-Object

基本上,当您比较事物时,PowerShell 会尝试将 right 转换为 left 的类型。如果您首先输入来自 ipcsv 的值 - left 将是一个字符串。如果你把一个数字放在第一位 - 它会将 CSV 文件中的值转换为一个数字(它足够聪明,可以保持足够大的类型;))

我用这段代码测试过:

@"
foo,bar,percent
alfa,beta,120.5
beta,gamma,99.9
foo,bar,30.4
works,cool,120.7
"@ | ConvertFrom-Csv | where { 100 -lt $_.percent }

...结果似乎还可以。

【讨论】:

    【解决方案2】:

    看看你与@Shay Levy 的对话,我会使用:

    [System.Globalization.CultureInfo] $culture = "en-us"
    

    所以你可以尝试类似:

    ([decimal]::parse($_.SumHoldingPercent ,$culture)) -gt 100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多