【问题标题】:Get values from 2 arrays从 2 个数组中获取值
【发布时间】:2022-06-10 18:27:53
【问题描述】:

也许标题是错误的,但我不知道如何解释。 我有 4 个 csv 文件,每个文件大约有 15000 行,看起来像这样

号码,"姓氏","名字","emailAddress","taxIdentifier" 100238963,"史密斯","约翰","john.smith@gmail.com","xxxxxxxxxxxx"

我读取了 9999 行并创建了一个我们在网站上使用的 json 文件来检查每个人,然后我们得到大多数用户的回复,回复是“数字” 然后我需要在第一个数组中找到所有这些人。 我今天也是这样做的,但是这样检查每个人都需要很长时间,有没有更好的方法?

这是从文件中获取人员并创建 json 文件的代码:

$Files = Get-ChildItem -Path "$Folders\\*" -Include *.csv -Force

foreach ($File in $Files){
    $fname = $file
    $fname = (Split-Path $File.name -leaf).ToString().Replace(".csv", "")
    $Savefile = $fname+ "_Cleaned.csv"

        $users = Import-Csv $File
        $body = "{`"requestId`": `"144x25`",`"items`": ["
 
$batchSize = 9999
$batchNum = 0
$row = 0
while ($row -lt $users.Count) {
    $test = $users[$row..($row + $batchSize - 1)]

foreach ($user in $test) {

    $nr = $user.number
    $tax = $user.taxIdentifier
    $body += "{`"itemId`": `"$nr`",`"subjectId`": `"$tax`"},"
}

然后这是处理响应的代码:

       $Result = @()

foreach ($1 in $response.allowedItemIds)
{
    foreach ($2 in $Users){

        If ($2.number -like $1)
        {
            $Result += [pscustomobject]@{
            number = $2.number
            Surname = $2.surname
            Forename = $2.forename
            Email = $2.emailaddress
            Taxidendifier = $2.taxIdentifier

        }
    }

}

}
$Result | Export-Csv -path "$folders\$savefile" -NoTypeInformation -Append
    $row += $batchSize
    $batchNum++

希望有人有任何想法

干杯

【问题讨论】:

  • 您能否举一个示例数据的 json 请求和响应示例?
  • 正文变量:{"itemId":"100164211","subjectId":"xxxxxxxxxxxx"} 响应变量:requestId responseId allowedItemIds --------- -------- --- -------------- 144x25 2efb8b47-d693-46ac-96b1-a31288567cf3 {100164211, 100415116, 100738809, 100097320...}

标签: arrays powershell csv


【解决方案1】:

我认为你可以这样做:

# read the original data file
$originalCsv = @"
number,"surname","forename","emailAddress","taxIdentifier"
1000,"Smith","Mel","mel.smith@example.org","xxxxxxxxxxxx"
3000,"Wilde","Kim","kim.wilde@example.org","xxxxxxxxxxxx"
2000,"Jones","Gryff Rhys","gryff.jones@example.org","xxxxxxxxxxxx"
"@
$originalData = $originalCsv | ConvertFrom-Csv

# get a response from the api
$responseJson = @"
{
  "requestId":      "144x25",
  "responseId":     "2efb8b47-d693-46ac-96b1-a31288567cf3",
  "allowedItemIds": [ 1000, 2000 ]
}
"@
$responseData = $responseJson | ConvertFrom-Json

# filter original data for matches to the response
$matches = $originalData | where-object { $_.number -in $responseData.AllowedItemIds }
# number surname forename   emailAddress            taxIdentifier
# ------ ------- --------   ------------            -------------
# 1000   Smith   Mel        mel.smith@example.org   xxxxxxxxxxxx
# 2000   Jones   Gryff Rhys gryff.jones@example.org xxxxxxxxxxxx

# write the data out
$matches | Export-Csv -Path ".\myfile.csv" -NoTypeInformation -Append

我不知道这是否会比您的示例执行得更好,但它应该这样做,因为它没有运行original row count * response row count 次的嵌套循环。

【讨论】:

    猜你喜欢
    • 2020-05-08
    • 2011-03-31
    • 2014-04-21
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多