检查大型 CSV 文件是否匹配 ID 需要很长时间



下面的Powershell运行正常 - 但是在50k行csv上需要10分钟等很长时间。我确信我正在让它比它需要的更努力地工作 - 我只需要匹配 ID 列,然后返回每个匹配的列。关于如何使其更快或更高效的任何想法?

$ID = @()
$fname = @()
$lname = @()
$mname = @()
$streetadd = @()
$apartment = @()
$city = @()
$state = @()
$zip = @()
$Ids = @(0317,11432,1104,9999,1955)
Write-Host "PLEASE WAIT >>> "
Import-Csv C:mycsv.csv |`
    ForEach-Object {
        $ID += $_."ID"
        $fname += $_."First Name"
        $lname += $_."Last Name"
        $mname += $_."Middle Name"
        $streetadd += $_."Street Address"
        $apartment += $_."Apartment"
        $city += $_."City"
        $state += $_."State"
        $zip += $_."Zip"
    }
    foreach ($Id in $Ids) {
        foreach ($elem in $ID) {
               # Write-Host $Id
                    if ($Id -contains $elem)
                                            {
                #Write-Host "Customer Exists!"
                $Where = [array]::IndexOf($ID, $elem)
                Write-Host $ID[$Where] $fName[$Where] $lname[$Where] $mname[$where] $streetadd[$where] $apartment[$where] $city[$where] $state[$where] $zip[$where] 
    }
    }
}

从下面的答案中尝试以下代码@Moerwald,但没有得到任何结果-

$Ids = @(1317,1132,110,9999,1955)
$rows = @(Import-Csv C:mycsv-csv.csv |? { $Ids -contains $_.id})
foreach ($r in $rows) {
 write-host $r.id; $r.fname
 }

$Ids = @(0317,11432,1104,9999,1955)
$rows = @(Import-Csv C:mycsv.csv |? { $Ids -contains $_.ID})

$rows将是过滤行的数组。您可以通过以下方式遍历数组:

$rows | % { Write-Host "$($_.Id)"} 

$_引用筛选的行,并具有与列名对应的属性。

?是位置对象 cmdlet 的快捷方式。

%是foreach对象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

这是运行版本的链接。

最新更新