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

标签 powershell csv

下面的 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)"} 

$_ 引用已过滤的行,并且具有与列名称相对应的属性。

?where-object 的快捷方式cmdlet。

%foreach-object 的快捷方式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

这是link到正在运行的版本。

关于powershell - 检查大型 csv 文件是否匹配 ID 需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56529385/

相关文章:

regex - Powershell-用于限制大写和第一个小写的正则表达式,其后仅是小写和数字

powershell - 从 cmd 调用 powershell 命令时出错

python - Numpy csv 脚本给出 'ValueError: setting an array element with a sequence'

javascript - 如何在客户端使用 SheetJS 将数据导出到 TSV 文件?

csv - 将 csv 导入到 Neo4j 缺失节点

powershell - 编辑 CSV 标题

powershell - 使用PowerShell在日志文件中计算唯一错误消息

c# - 检查计算机是否通过 Wake On Lan 激活

powershell - 在字符串数组的开头和结尾插入引号

rmr2 mapreduce csv 列子集