我创建了一个导入2列CSV数据的脚本,按一个类型对int进行排序,并且只显示0到10,000之间的值。我已经能够进入排序部分了,我只能显示大于0.当我尝试添加" -and -lt 10000"各种方式,我无法获得任何有用的数据。不过,有一次尝试给了我数据,好像它又是字符串一样。
这只给了我> 0但排序为int类型。中途!:
PS C:\> $_ = Import-Csv .\vc2.csv | Select -Property User_Name, Minutes; $_ | Sort {[int] $_.Minutes} | Where {($_.Minutes -gt 0)}
这给了我10000> x> 0但排序为字符串:
PS C:\> $_ = Import-Csv .\vc.csv | Select -Property User_Name, Minutes; $_ | Sort {[int] $_.Minutes} | Where {($_.Minutes -gt 0) -and ($_.Minutes -lt 10)}
这里和这里是我尝试重铸为int的地方,它给了我很多错误:
PS C:\> $_ = Import-Csv .\vc.csv | Select -Property User_Name, Minutes; $_ | Sort {[int] $_.Minutes} | Where {[int]{($_.Minutes -gt 0) -and ($_.Minutes -lt 10000)}}
PS C:\> $_ = Import-Csv .\vc.csv | Select -Property User_Name, Minutes; $_ | Sort {[int] $_.Minutes} | Where { ({[int]$_.Minutes} -gt 0) -and ({[int]$_.Minutes} -lt 10000) }
错误:无法转换"($ .Minutes -gt 0) - 和($ .Minutes -lt 10000)" type" System.Management.Automation.ScriptBlock"输入" System.Int32"。
这个的正确语法是什么?
答案 0 :(得分:2)
PowerShell通常会将二元运算符的参数强制转换为 left 操作数的类型。这意味着在执行$_.Minutes -gt 10
时10
转换为字符串,因为解析后的CSV中的字段始终是字符串。您可以切换操作数:10 -lt $_.Minutes
或添加演员:[int]$_.Minutes -gt 10
或+$_.Minutes -gt 10
。
通常,在处理包含我想要使用的非字符串数据的CSV时,我倾向于只添加一个后处理步骤,例如:
Import-Csv ... | ForEach-Object {
$_.Minutes = [int]$_.Minutes
$_.Date = [datetime]$_.Date
...
}
之后数据处理得更好,没有过多的演员和转换。
答案 1 :(得分:1)
问题是在Where语句中使用{和}括号。这些被解释为脚本块。
Where { ({[int]$_.Minutes} -gt 0) -and ({[int]$_.Minutes} -lt 10000) }
尝试使用(和)或完全排除它们。
Where { (([int]$_.Minutes) -gt 0) -and (([int]$_.Minutes) -lt 10000) }
您为$ _分配值的方式也很奇怪。
答案 2 :(得分:0)
$ _表示管道中的当前值。
$list = @(1,2,3)
$list | foreach { $_ }
1
2
3
通过分配" $ _"一个值,一旦将其放入管道中,就会丢失该值。
尝试以下方法: $ mycsv = import-csv。\ vc.csv; $ mycsv |选择......等等。