【问题标题】:Powershell script poor performance when creating a CSV file from JSON从 JSON 创建 CSV 文件时,Powershell 脚本性能不佳
【发布时间】:2015-11-18 18:24:06
【问题描述】:

以下代码存在性能问题。我想将一些信息从 JSON 文件解析为 CSV。 JSON 本身有大约 200k 行。这种转换的性能不好,因为处理这样​​一个文件需要超过 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
    }
}

【问题讨论】:

  • 如果你想要更好的性能,我建议使用 jq,它很容易安装在 Windows 上。要使用 jq 处理 200,000 行文件来完成您描述的那种任务,不应该超过 1 秒。 jq下载页面为stedolan.github.io/jq/download;如果你有巧克力,以下应该足够了:choco install jq

标签: json csv powershell


【解决方案1】:

好的,我想这里有几节课。首先,不要重写Export-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

【讨论】:

  • 完美。非常感谢。该脚本将时间减少到 10 分钟。根据@sodawillow 的建议,我更进一步,创建了一个单独的 C# 控制台应用程序,可在 10 秒内将 JSON 转换为 CSV。
猜你喜欢
  • 2019-03-10
  • 1970-01-01
  • 2011-02-26
  • 2019-05-31
  • 2020-12-26
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
相关资源
最近更新 更多