我正在try 使用PowerShell将一个JSON文件(从Mongo的Export-MdbcData输出)加载到一个SQL Server表中.JSON文件数据示例如下:

{ "code" : "0088", "name" : "BUTTON", "detail" : { "quantity" : 1 } }
{ "code" : "0081", "name" : "MATTERHORN", "detail" : { "quantity" : 2 } }
{ "code" : "0159", "name" : "BANKSTON", "detail" : { "quantity" : 1 } }

在下面的PowerShell脚本中,文件被读入数组,数组被转换为数据表以加载到SQL服务器表中.有没有更好/更快的方法来读入JSON文件?对于一个小的输入文件,只需几秒钟就可以加载数据,但对于超过400万条记录,整个过程需要数小时.

$encoding = [System.Text.Encoding]::UTF8    
$output = [System.Collections.ArrayList]::new()

foreach ($line in [System.IO.File]::ReadLines($pathToJsonFile, $encoding)) 
{
    $json = $line | ConvertFrom-Json 
    foreach ($detail in $json.detail) 
    {
       [void]$output.Add(
                          [pscustomobject]@{
                                      code = $json.code
                                      name = $json.name
                                      quantity = $detail.quantity
                                    }
                        )
    } 
} 
$dataTable = [System.Data.DataTable]::new()
$dataTable = $output | ConvertTo-DataTable
.
.

UPDATE:
I modified the script using @Charlieface's suggestion and removed the inner foreach statement to see if it will speed it up more. It loaded 4M+ records in about 17 minutes. I used batchsize = 80K and each insert iteration took about 14 seconds. However, comparing to a CSV file input with the same batch size and record count, the insert iteration takes about 3 seconds. I'm guessing the parsing of the JSON takes longer than a delimited file.

foreach ($line in [System.IO.File]::ReadLines($pathToJsonFile, $encoding)) 
{
    $json = $line | ConvertFrom-Json;
    [void]$dataTable.Rows.Add($json.code, $json.name, $json.detail.quantity);
    $i++; 
    if (($i % $batchsize) -eq 0) { 
        $bulkcopy.WriteToServer($dataTable) 
        Write-Host "$i rows have been inserted in $($elapsed.Elapsed.ToString())."
        $datatable.Clear() 
    }

}

推荐答案

直接创建数据并将其添加到DataTable中可能会更快,而不是使用ArrayListpscustomobject

$dataTable = [System.Data.DataTable]::new();
[void]$dataTable.Columns.Add('code', [string]);
[void]$dataTable.Columns.Add('name', [string]);
[void]$dataTable.Columns.Add('quantity', [int]);

$encoding = [System.Text.Encoding]::UTF8;

foreach ($line in [System.IO.File]::EnumerateLines($pathToJsonFile, $encoding)) 
{
    $json = $line | ConvertFrom-Json;
    foreach ($detail in $json.detail) 
    {
        [void]$dataTable.Rows.Add($json.code, $json.name, $detail.quantity);
    }
}

您可能还希望将DataTable容量预分配给一些足够大的容量,以防止调整基础数组的大小.

$dataTable.MinimumCapacity = 4100000;

Json相关问答推荐

按照对象键的值对PostgreSQL JSONB对象进行排序'

JOLT将对象名作为新属性添加到主体中

由于无效的UTF-8开始字节0xa0,JSON被拒绝,但编码似乎有效

在AWS步骤函数中将字符串解析为JSON&S映射状态

织女星-没有循环的动画条形图第二部分(实际上是织女星)

JOLT转换以根据条件删除json对象

jq 对特定键进行过滤并将值整理到单个 csv 单元格中

使用 jq 获取所有嵌套键和值

如何迭代、动态加载我的表单输入元素,然后在 React 中的表单提交上检索输入值?

判断 JSON 中的对象,而不是条件中提到的对象

Google GCM 服务器返回未经授权的错误 401

python,将Json写入文件

json.dumps 打乱了顺序

json.decoder.JSONDecodeError:期望值:第 1 行第 1 列(字符 0)

如何在返回对象的 Spring MVC @RestController @ResponseBody 类中响应 HTTP 状态代码?

按 JSON 数据类型 postgres 排序

验证和格式化 JSON 文件

如何转换为 D3 的 JSON 格式?

运算符不存在:json = json

从调试器获取 IntelliJ Idea 中的 JSON 对象