导入单行CSV后PowerShell中Count为null及ArrayList转换问题求助
处理Import-Csv单条数据时的数组转换问题
问题场景
导入包含1行表头+1行数据的CSV文件:
hcode,scode,sname,Cui,Data,Denumire,Adresa 74489,!00001,tstvnd,19706741,2023-02-10,"test fiscal hist","Str. TEst "
执行导入命令:
$csvChkPrs= Import-Csv -Path $o_fsFileInput.FullName -Delimiter "," -Encoding UTF8
遇到两个问题:
- 调用
$csvChkPrs.Count返回null,需用复杂逻辑判断行数:$iRows= If ( ($null -ne $csvChkPrs) -and ($null -eq $csvChkPrs.Count)) {1} elseif ($null -ne $csvChkPrs) {$csvChkPrss.Count} - 将
$csvChkPrs传入期望Collection.ArrayList类型的函数时,报错“PSCustomObject无法转换为Collection.ArrayList”,当前只能通过循环逐个添加:ForEach ($Line in $csvChkPrs) {$o_colChkPrs.Add($Line) |Out-null}
原因分析
PowerShell的Import-Csv cmdlet会根据返回结果的数量自动调整类型:
- 当CSV有多条数据时,返回数组类型的
PSCustomObject集合,拥有Count属性 - 当只有1条数据时,返回单个
PSCustomObject实例,没有Count属性;且单个对象无法直接转换为ArrayList类型
优化解决方案
1. 强制将Import-Csv结果转为数组
通过@()运算符强制把结果包装成数组,无论数据量多少都能保证返回数组类型,直接获取正确的行数:
$csvChkPrs = @(Import-Csv -Path $o_fsFileInput.FullName -Delimiter "," -Encoding UTF8) # 直接获取行数,无需复杂判断 $iRows = $csvChkPrs.Count
2. 快速生成ArrayList(无需循环)
方法一:利用ArrayList构造函数直接转换数组
$o_colChkPrs = [System.Collections.ArrayList]@($csvChkPrs)
方法二:使用AddRange批量添加
如果已经初始化了ArrayList,直接用AddRange批量导入数据,比循环高效得多:
$o_colChkPrs = New-Object System.Collections.ArrayList # 批量添加数组内容,无需逐个循环 $o_colChkPrs.AddRange(@($csvChkPrs)) | Out-Null
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

