Powershell 检查大型csv文件是否有匹配的ID';It’要花很长时间

Powershell 检查大型csv文件是否有匹配的ID';It’要花很长时间,powershell,csv,Powershell,Csv,下面的powershell功能正常-但是它需要很长时间,比如50k线路上需要10分钟。我确信我正在使它比它需要的更难工作-我只需要匹配ID列,然后为每个匹配返回列。有什么办法能让这更快更高效 $ID=@() $fname=@() $lname=@() $mname=@() $streetadd=@() $公寓=@() $city=@() $state=@() $zip=@() $Ids=@(031711432110499991955) 写主机“请稍候>>>” 导入Csv C:\mycsv.Cs

下面的powershell功能正常-但是它需要很长时间,比如50k线路上需要10分钟。我确信我正在使它比它需要的更难工作-我只需要匹配ID列,然后为每个匹配返回列。有什么办法能让这更快更高效

$ID=@()
$fname=@()
$lname=@()
$mname=@()
$streetadd=@()
$公寓=@()
$city=@()
$state=@()
$zip=@()
$Ids=@(031711432110499991955)
写主机“请稍候>>>”
导入Csv C:\mycsv.Csv|`
ForEach对象{
$ID+=$。“ID”
$fname+=$。“名字”
$lname+=$。“姓氏”
$mname+=$。“中间名”
$streetadd+=$。“街道地址”
$公寓+=$。“公寓”
$city+=$。“城市”
$state+=$。“state”
$zip+=$。“zip”
}
foreach($Id中的$Id){
foreach($ID中的元素){
#写入主机$Id
如果($Id-包含$elem)
{
#写主机“客户存在!”
$Where=[array]::IndexOf($ID,$elem)
写入主机$ID[$Where]$fName[$Where]$lname[$Where]$mname[$Where]$streetadd[$Where]$partment[$Where]$city[$Where]$state[$Where]$zip[$Where]
}
}
}
$rows
将是筛选行的数组。您可以通过以下方式迭代数组:

$rows | % { Write-Host "$($_.Id)"} 
$\u
引用已筛选的行,并具有与列名对应的属性

是cmdlet的快捷方式

%
是cmdlet的快捷方式

更新

此代码适用于:

$s =@'
Student ID,OtherID,First Name,Last Name,Middle Name,Birth Date,,,,,,,,Street Address Line 1,Street Address Line 2,Apartment,City,State,Zip
 1317,,a,b,c,6/11/2019,,,,,,,,1 5th dr,,,main,nv,55555
 1132,,d,e,f,6/10/2019,,,,,,,,7 24th dr,,,duke,az,55555
 '@

 $csv = convertfrom-csv $s
 $Ids = @(1317,1132, 11432,1104,9999,1955)

 $rows = $csv |? { $Ids -contains $_.'Student ID'} 

 $rows | % { $_.'Student ID'}
这将返回:

1317
1132

以下是运行版本的详细信息

我建议使用数组列表,在使用标准PS数组时,每执行一次
+=
数组操作都会分配一个新数组。通过
新建对象系统.Collections.ArrayList创建数组列表
,然后您可以调用
添加
方法Csv文件中使用的分隔符是什么<代码>导入Csv默认分隔符为
。是的,这是一个可以发布Csv内容的命令?它看起来更像:学生ID、其他ID、名字、姓氏、中间名、出生日期、,,,,,,,,,,,,街道地址行1,街道地址行2,公寓,城市,州,邮编1317,,a,b,c,2019年11月6日,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1第五个dr,,,,main,内华达州,555 1132,d,e,f,2019年6月10日,,,,,,,,7第24届博士,,,杜克,亚利桑那州,55555我想这就是我要寻找的,但我正试图将我的大脑围绕它-我尝试了一个foreach($rows in$rows){$rows |%{Write Host“$($.Id)”}---但它似乎不起作用。
%
操作符充当
行上的foreach,实际对象被分配到
$\uuu
坦斯克,但我想我只是没有让它工作-foreach会是什么样子?foreach($elem in${}
foreach($r in$rows){$r.Id;$r.fname}
我用我尝试过的代码更新了我的问题,结果为0
1317
1132