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

Powershell 将BigQuery json从API转换为CSV的最有效方法,powershell,api,google-bigquery,Powershell,Api,Google Bigquery,各位早上好/下午好 当您对GoogleBigQueryAPI运行查询时,您会在一个JSON文件中得到一个奇怪的响应 您可以在$ColumnName=$Response.schema.fields.name中找到列名,但列的值在$Row=$Response.rows中 以下是行的外观: { "f": [ "@{v=@2019-11-04 14:14:49}", "@{v=@834953107914843912

各位早上好/下午好

当您对GoogleBigQueryAPI运行查询时,您会在一个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=1}",
                  "@{v=0}",
                  "@{v=1}",
                  "@{v=google}",
                  "@{v=organic}",
                  "@{v=(not set)}",
                  "@{v=(not provided)}",
                  "@{v=mobile}",
                  "@{v=/}",
                  "@{v=/}",
                  "@{v=No}",
                  "@{v=Yes}",
                  "@{v=No}"
              ]
    },
    {
        "f":  [
                  "@{v=@2019-11-04 08:52:48}",
                  "@{v=@3602395308467676896}",
                  "@{v=New Visitor}",
                  "@{v=4a9bcd67a01d}",
                  "@{v=Yes}",
                  "@{v=We\u0027re happy to carry out the work.}",
                  "@{v=}",
                  "@{v=1}",
                  "@{v=0}",
                  "@{v=ivr}",
                  "@{v=sms}",
                  "@{v=ivr-deflect}",
                  "@{v=(not set)}",
                  "@{v=mobile}",
                  "@{v=/}",
                  "@{v=/}",
                  "@{v=Yes}",
                  "@{v=No}",
                  "@{v=No}"
              ]
    }
因此,每一行被分配给“f”,每一列的值被分配给“v”,在“f”的内部

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

$Data=@()
对于($j=0;$j-lt$RowCount;$j++){
$Datarow=新对象PSObject
对于($i=0;$i-lt$ColumnCount;$i++){
$Datarow |添加成员-类型NoteProperty-名称$ColumnName[$i]-值$Row[$j].f.v[$i]
}
$Data+=$Datarow
}
但正如你所想象的,它的报价很慢。特别是在我们有点陈旧的服务器上,它将被安排在那里

你知道更好的方法吗?


关于Jarek,有两种方法可以加快代码的速度:

  • 避免使用
    +=
    递增地“扩展”数组,因为这需要在每次迭代中在幕后创建一个新数组;相反,使用
    for
    循环作为表达式,让PowerShell在数组中为您收集其输出

  • 通过首先在有序哈希表中创建属性值对(速度更快),然后将哈希表强制转换为
    [pscustomobject]
    ,以将其转换为自定义对象(PSv3+),避免代价高昂的
    新对象
    添加成员
    调用

更新:Jarek(OP)报告说,此解决方案比原始解决方案快约3倍。
如果没有
[pscustomobject]
强制转换(即直接使用哈希表实例),系数约为5,但请注意,您当前(从PowerShell Core 7.0.0-preview.5开始)无法将哈希表与
导出Csv
/
转换为Csv
一起使用。
添加对此的支持是。

谢谢,@JarekSzczyg-answer更新。请注意,我添加了一个功能请求链接,以使
导出Csv
/
转换为Csv
支持哈希表(字典),就像
转换为Json
已经做的那样。如果您还想看到此功能,请在GitHub上竖起大拇指。
$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.
  }