Powershell脚本从JSON创建CSV文件时性能不佳

Powershell脚本从JSON创建CSV文件时性能不佳,json,csv,powershell,Json,Csv,Powershell,我对下面的代码有一个性能问题。我想将一些信息从JSON文件解析为CSV文件。JSON本身大约有20万行。此转换的性能不好,因为处理此类文件需要1个多小时 我想问题可能出在添加内容功能上,因为我使用的是普通硬盘。如果您看到代码的任何改进或我可以做的任何更改,请告诉我好吗 $file = "$disk\TEMP\" + $mask $res = (Get-Content $file) | ConvertFrom-Json $file = "$disk\TEMP\result.csv" Write-

我对下面的代码有一个性能问题。我想将一些信息从JSON文件解析为CSV文件。JSON本身大约有20万行。此转换的性能不好,因为处理此类文件需要1个多小时

我想问题可能出在
添加内容
功能上,因为我使用的是普通硬盘。如果您看到代码的任何改进或我可以做的任何更改,请告诉我好吗

$file = "$disk\TEMP\" + $mask
$res = (Get-Content $file) | ConvertFrom-Json
$file = "$disk\TEMP\result.csv"

Write-Host "Creating CSV from JSON" -ForegroundColor Green
Add-Content $file ("{0},{1},{2},{3},{4}" -f "TargetId", "EventType", "UserId", "Username", "TimeStamp")

$l = 0
foreach ($line in $res) {
    if($line.EventType -eq 'DirectDownloadCompleted' -and $line.TargetDefinition -eq 'GOrder') { 
        #nothing here
    } elseif($line.EventType -eq 'DirectDownloadCompleted' -and $line.TargetDefinition -eq 'GFile') {
        Add-Content $file ("{0},{1},{2},{3},{4}" -f
        $line.AssetId, $line.EventType, $line.UserId, $line.UserName, $line.TimeStamp)
        $l = $l + 1
    } else {
        Add-Content $file ("{0},{1},{2},{3},{4}" -f $line.TargetId, $line.EventType, $line.UserId, $line.UserName, $line.TimeStamp)
        $l = $l + 1
    }
}

好的,我想这里有几节课。首先,不要重新编写
导出CSV
cmdlet。相反,将您的信息转换为一个对象数组,并一次输出所有信息。这将使您只需向文件写入一次,这将大大提高您的速度。另外,如果
Switch
cmdlet中已经存在此函数,则不要执行
ForEach>If>IfElse>Else
。试着这样做:

$Results = Switch($res){
    {$_.EventType -eq 'DirectDownloadCompleted' -and $_.TargetDefinition -eq 'GOrder'}{Continue}
    {$_.EventType -eq 'DirectDownloadCompleted' -and $_.TargetDefinition -eq 'GFile'}{$_ | Select @{l='TargetId';e={$_.AssetId}},EventType,UserId,Username,TimeStamp;Continue}
    Default {$_ | Select TargetId,EventType,UserId,Username,TimeStamp}
}
$Results | Export-CSV $file -NoType
$l = $Results.Count

如果您想获得更好的性能,我建议您使用jq,它很容易安装在Windows上。对于您描述的任务类型,使用jq处理200000行文件不应超过1s。jq下载页面是;如果您有巧克力,以下内容应该足够:choco安装jqPerfect。非常感谢。这个脚本将时间缩短到了10分钟。根据@sodawillow的建议,我更进一步,创建了一个单独的C#控制台应用程序,它可以在10秒内将JSON转换为CSV。