проверка большого файла CSV на соответствие идентификаторов занимает много времени - PullRequest
2 голосов
/ 10 июня 2019

Приведенный ниже PowerShell работает нормально, однако это занимает много времени, например, 10 минут на 50-килограммовой линии CSV. Я уверен, что заставляю его работать больше, чем нужно - мне нужно только сопоставить столбец идентификатора, а затем вернуть столбцы для каждого совпадения. Есть идеи, как сделать это быстрее и эффективнее?

$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
 }

1 Ответ

2 голосов
/ 10 июня 2019
$Ids = @(0317,11432,1104,9999,1955)
$rows = @(Import-Csv C:\mycsv.csv |? { $Ids -contains $_.ID})

$rows будет массивом отфильтрованных строк.Вы можете перебирать массив с помощью:

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

$_ ссылается на отфильтрованную строку и имеет свойства, соответствующие именам столбцов.

? - это ярлык для командлета where-object .

% - это ярлык для командлета foreach-object .

Обновление :

Этот код работает:

$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

Вот ссылка на работающую версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...