gpt4 book ai didi

powershell - 遍历CSV并创建一个数组

转载 作者:行者123 更新时间:2023-12-03 01:29:49 25 4
gpt4 key购买 nike

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

enter image description here

我需要一行一行地分离数据,输出应如下所示。 call 总数和要更新的平均响应时间。

enter image description here

我为不同类型的API调用编写了复杂的If if条件,并且能够从csv中获取方案名称和其他值。我的痛苦从这里开始,努力得出结论,继续前进。我可以创建一个数组并存储所有值,然后稍后进行所有计算,还是将值写入另一个csv中,然后进行所有计算以找到计数和平均响应时间?

如果我选择数组,则场景不应重复。对我来说,在不知道可用的cmdlet用于数组和CSV的情况下,很难做出决定。请给点灯..

提前致谢...

最佳答案

这是一种可以结合使用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'

关于powershell - 遍历CSV并创建一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59360692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com