You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell如何将Import-CSV生成的PSCustomObject属性值转为整数

问题原因

Import-Csv 导入生成的所有元素默认都是PSCustomObject类型,所有字段的默认存储类型为字符串。你检测到值为PSCustomObject,本质是属性提取写法有误:未加-ExpandProperty参数时,Select-Object 字段名返回的是包裹了对应字段的包装对象,而非字段本身的原始值。
另外你之前尝试的整体强转写法本身就不成立:PowerShell不支持直接将值集合整体强转为单个int类型,必须逐元素执行类型转换,这也是你代码触发报错的核心原因。

可用解决方案

以下方案均可直接落地,转换后即可正常执行数值排序、算术处理等操作:

  • 逐元素转换(最通用,兼容所有PowerShell版本)
    直接遍历集合时对目标字段做类型转换,转换结果可直接接后续处理逻辑:
    # 提取Level字段批量转int后直接排序
    $sortedIntValues = $MyArray | ForEach-Object { [int]$_.Level } | Sort-Object
    
    如果需要保留原对象的其他字段,仅修正Level的类型,可遍历重建对象:
    $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)存在两个问题:

  1. 若实际执行时遗漏-ExpandProperty参数,select Level返回的是仅包含Level属性的PSCustomObject集合,不存在直接转int的逻辑
  2. 即便正确加了-ExpandProperty拿到所有Level的字符串值集合,直接对整个集合使用[int]强转,PowerShell会尝试把整个集合对象转为单个整数,必然触发类型转换错误。

内容的提问来源于stack exchange,提问作者J.Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 21:10:09