PowerShell如何将Import-CSV生成的PSCustomObject属性值转为整数
问题原因
Import-Csv 导入生成的所有元素默认都是PSCustomObject类型,所有字段的默认存储类型为字符串。你检测到值为PSCustomObject,本质是属性提取写法有误:未加-ExpandProperty参数时,Select-Object 字段名返回的是包裹了对应字段的包装对象,而非字段本身的原始值。
另外你之前尝试的整体强转写法本身就不成立:PowerShell不支持直接将值集合整体强转为单个int类型,必须逐元素执行类型转换,这也是你代码触发报错的核心原因。
可用解决方案
以下方案均可直接落地,转换后即可正常执行数值排序、算术处理等操作:
- 逐元素转换(最通用,兼容所有PowerShell版本)
直接遍历集合时对目标字段做类型转换,转换结果可直接接后续处理逻辑:
如果需要保留原对象的其他字段,仅修正Level的类型,可遍历重建对象:# 提取Level字段批量转int后直接排序 $sortedIntValues = $MyArray | ForEach-Object { [int]$_.Level } | Sort-Object$fixedData = $MyArray | ForEach-Object { [PSCustomObject]@{ # 其他字段按原CSV字段名原样复制即可 UserName = $_.UserName SubmitTime = $_.SubmitTime # 仅将Level转为整数类型 Level = [int]$_.Level } } # 此时对Level排序会按数值规则排序,不会出现字符串排序的"10<2"问题 $fixedData | Sort-Object Level - 计算属性替换(无需手动枚举所有字段)
通过Select-Object的计算属性重写Level字段,不用手动列全其他属性:$fixedData = $MyArray | Select-Object *, @{ Name = 'Level' Expression = { [int]$_.Level } } -ExcludeProperty Level - 导入阶段直接指定类型(PowerShell 5.1+支持)
调用Import-Csv时直接传入字段类型映射,从导入源头就把目标字段转为整数,无需后续二次处理:$MyArray = Import-Csv -Path 'C:\path\to\your\data.csv' -Property @{ Level = [int] # 其他需要转数值的字段也可在此处声明,比如 Score = [double] }
原写法报错的具体原因
你之前使用的[int]($MyArray | select -ExpandProperty Level)存在两个问题:
- 若实际执行时遗漏
-ExpandProperty参数,select Level返回的是仅包含Level属性的PSCustomObject集合,不存在直接转int的逻辑 - 即便正确加了
-ExpandProperty拿到所有Level的字符串值集合,直接对整个集合使用[int]强转,PowerShell会尝试把整个集合对象转为单个整数,必然触发类型转换错误。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

