将BigQuery json从API转换为CSV的最有效方法

大家早上好/下午好

针对Google BigQuery API运行查询时,您会在以奇怪的方式构造的JSON文件中获得响应。

您可以在$ColumnName = $Response.schema.fields.name中找到列名,但是列的值在$Row = $Response.rows中。

这是行的样子:

{
        "f":  [
                  "@{v=@2019-11-04 14:14:49}","@{v=@8349531079148439128}","@{v=Returning Visitor}","@{v=1}","@{v=Yes}","@{v=Good news!}","@{v=0}","@{v=google}","@{v=organic}","@{v=(not set)}","@{v=(not provided)}","@{v=mobile}","@{v=/}","@{v=No}","@{v=No}"
              ]
    },{
        "f":  [
                  "@{v=@2019-11-04 08:52:48}","@{v=@3602395308467676896}","@{v=New Visitor}","@{v=4a9bcd67a01d}","@{v=We\u0027re happy to carry out the work.}","@{v=}","@{v=ivr}","@{v=sms}","@{v=ivr-deflect}","@{v=No}"
              ]
    }

因此,在“ f”内部,将每一行分配给“ f”,将每一列的值分配给“ v”。

为了使它们具有正确的格式,我在下面编写了一对循环:

$Data = @()
for($j=0; $j -lt $RowCount; $j++){
    $Datarow = New-Object PSObject
    For($i=0; $i -lt $ColumnCount; $i++){
        $Datarow | Add-Member -type NoteProperty -Name $ColumnName[$i] -Value $Row[$j].f.v[$i]
    }
    $Data += $Datarow
}

但是您可以想象,报价缓慢。尤其是在我们的老旧的服务器计算机上,它将对其进行调度。

您知道更好的方法吗?

致敬Jarek

jxs121000 回答:将BigQuery json从API转换为CSV的最有效方法

有两种方法可以加快代码速度:

  • 避免使用+=逐步“扩展”您的数组,因为这需要在每次迭代后在幕后创建一个 new 数组;相反,请使用for循环作为 expression ,然后让 PowerShell 将其输出收集到数组中。

  • 通过首先在有序哈希表中创建属性-值对(这要快得多),然后再进行强制转换,从而避免了昂贵的New-ObjectAdd-Member调用hashtble转换为[pscustomobject],以便将其转换为自定义对象(PSv3 +)。

$Data = 
  for ($j=0; $j -lt $RowCount; $j++){
      $Datarow = [ordered] @{} # an ordered hashtable that represents a row.
      For($i=0; $i -lt $ColumnCount; $i++){
        $Datarow[$ColumnName[$i]] = $Row[$j].f.v[$i]
      }
      [pscustomobject] $Datarow # convert to a custom object and output.
  }

更新:Jarek(OP)报告说,该解决方案的速度比原始解决方案快3倍。
如果不进行[pscustomobject]强制转换(即直接使用哈希表实例),该因子约为5,但请注意,您当前(从PowerShell Core 7.0.0-preview.5开始)无法将哈希表与{{1}一起使用} / Export-Csvthis feature request on GitHub就是为此添加支持。

本文链接:https://www.f2er.com/3157573.html

大家都在问