Powershell 迭代CSV并创建一个数组

Powershell 迭代CSV并创建一个数组,powershell,Powershell,我是Powershell的新手。需要CSV自动化的逻辑。我有一个CSV日志文件包含大量API调用 我需要一行一行地分离数据,输出如下。呼叫计数和要更新的平均响应时间之和 我已经为不同类型的API调用编写了复杂的If-else条件,并且能够从csv中获取场景名称和其他值。我的痛苦从这里开始,挣扎着得出结论,继续前进。我是否可以创建一个数组并存储所有值,然后稍后执行所有计算,或者将值写入另一个csv,然后执行所有计算以查找计数和平均响应时间 若我选择数组,那个么场景就不应该重复。对我来说,如果不

我是Powershell的新手。需要CSV自动化的逻辑。我有一个CSV日志文件包含大量API调用

我需要一行一行地分离数据,输出如下。呼叫计数和要更新的平均响应时间之和

我已经为不同类型的API调用编写了复杂的If-else条件,并且能够从csv中获取场景名称和其他值。我的痛苦从这里开始,挣扎着得出结论,继续前进。我是否可以创建一个数组并存储所有值,然后稍后执行所有计算,或者将值写入另一个csv,然后执行所有计算以查找计数和平均响应时间

若我选择数组,那个么场景就不应该重复。对我来说,如果不知道array和CSV的可用cmdlet,就很难做出决定。请投一些光


提前感谢…

这里有一种方法,您可以使用Powershell提供的c#组合(可以更高效地处理较大的文件和数据)

第一个组件是您需要一些一致的逻辑来隔离希望分配给每个URL的API类别。从你的截图看来,有时候你使用的是URL的最后一段,而另一些则是资源中间的某个路径。 这里是一个快速的方法,您可以传入一个类别数组,如果它可以以任何方式与URI匹配,那么就使用该类别。否则,URI将作为自己的类别。请替换为您想要的任何逻辑

function Get-ApiCategory {
    param([string[]] $Categories, [string] $Text)
    foreach ($c in $Categories) {
        if ($Text.IndexOf($c) -gt 0) {
            return $c
        }
    }
    return $Text # Not found
}
然后,这里有一个方法:(1)逐行读取大型CSV文件,并使用基本解析逻辑(因为源数据似乎足够简单),而无需将完整文件加载到内存中,然后(2)导出包含摘要数据的CSV文件

function Write-SummaryToFile {
    param([string[]] $Categories, [string] $InputFile, [string] $Output)

    # Parse the file line-by-line (optimize for memory)
    $result = @{}
    $lineNum = 0
    Write-Host $InputFile
    foreach ($line in [System.IO.File]::ReadLines($InputFile)) {
        if ($lineNum++ -lt 1) { continue } # Skip header
        $cols = $line.Split(',')
        $category = Get-ApiCategory $Categories $cols[0]
        $new = @{
            Category = $category
            Count = [int]$cols[1]
            AvgResponse = [double]$cols[2]
        }
        if ($result.ContainsKey($category)) {
            $weighted = $result[$category].AvgResponse * $result[$category].Count
            $result[$category].Count += $new.Count
            $result[$category].AvgResponse = ($weighted + $new.AvgResponse * $new.Count) / $result[$category].Count;
        } else {
            $result[$category] = $new
        }
    }

    # Output to file
    if (Test-Path $Output) { Remove-Item $Output }
    try {
        $stream = [System.IO.StreamWriter] $Output
        $stream.WriteLine('Scenario,Count,Avg_Response_Time')
        $result.Values | ForEach-Object { $stream.WriteLine([string]::Format("{0},{1},{2}", $_.Category, $_.Count, $_.AvgResponse.ToString("0.##"))) }
    }
    finally {
        $stream.Dispose()
    }

}
然后,您可以在如下示例中调用这些方法:

$categories = @('MoveRequestQueue', 'DeliveryDate')
Write-SummaryToFile $categories 'c:\dev\scratch\ps1\test.csv' 'C:\dev\scratch\ps1\Output.csv'

请注意。请不要发布文本/代码/数据/错误的图像。。。为什么要强迫别人眯着眼睛看呢?为什么要强迫别人通过输入你已经有的文本来测试呢?哦,对不起,我刚刚从excel复制并粘贴在这里。但默认情况下,它会转换为图像。将在未来avid。感谢@JeffZeitlin将检查和更新..感谢Jason为您付出的努力和时间。。将尝试在此处更新谢谢Jason。。工作正常。我需要更新我的代码。