从JSON创建CSV文件时,Powershell脚本性能较差

时间:2015-11-18 18:24:07

标签: json csv powershell

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

我认为问题可能出在Add-Content功能上,因为我正常使用普通硬盘。如果您看到代码的任何改进或我可以做的任何更改,请您告诉我吗?

$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
    }
}

1 个答案:

答案 0 :(得分:3)

好的,我想这里有一些教训。首先,不要重写Export-CSV cmdlet。而是将您的信息转换为对象数组,并一次输出所有对象。这将使您只需要写入一次文件,这将显着提高您的速度。另外,当ForEach>If>IfElse>Else cmdlet中已存在此函数时,请勿执行Switch。尝试这样的事情:

$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
相关问题