[Powershell] 配列データを指定した数値で分割する方法

はじめに

大量データなどをREST APIを利用して連携する場合、連携先などのサイズ制限などで一括でデータを送信することができないケースがあります。

そう言った場合大量データを分割して送信するために、配列データを指定した数分で分割する方法を備忘録としてまとめておきます。

実行環境

カテゴリ内容
OSWindows 10 Pro 2202
PSVersion5.1.22000.653

大量データの作成

まず大量データの作成は一般的には、CSVやJSONファイル、データベースなどから取得するかと思います。
今回は、CSVファイルから情報を取得します。

"Name","Contents","Remark"
"test000001","contents000001","remark0000001"
・・・
"test100000","contents000001","remark0000001"

上記のような10万件のデータを作成します。
用意したら、「Import-Csv」Cmdletを利用して読み込みます。

$items = Import-Csv -Path ".¥massdata.csv" -Encoding UTF8

もし、コード内で作成したい場合は下記のようにArrayListを用意して、PSObjectを作成して配列に格納していきます。

$items = New-Object System.Collections.ArrayList
for($i = 1; $i -le 100000; $i++) {
    $property = New-Object -TypeName PSObject
    $property | Add-Member -Type NoteProperty -Name "Name" -Value ("test{0:D6}" -f $i)
    $property | Add-Member -Type NoteProperty -Name "Contents" -Value ("contents{0:D6}" -f $i)
    $property | Add-Member -Type NoteProperty -Name "Remark" -Value ("remark{0:D6}" -f $i)
    [void]$items.add($properties)
}

どちらも100,000件のデータ配列となります。
ちなみに、PSObjectで作成すると、下記のようにデータを参照することができます。

# データ数の取得
$items.count

# データ参照
$items[0].Name

指定した件数で配列を分割する

分割したい数ではなく、分割するデータ数を指定します。(例えば10万件のデータを1万件ずつの配列に分割する)

手順としては

  1. レコード数(データ数)を取得する
  2. 分割数を計算する
  3. 分割数でループ処理する

となります。

# 分割するデータ数(今回は1万件ずつ分割)
$targetCnt = 10000
# レコード数
$recordCnt = $items.count
# 分割数の計算(Ceiling関数を使います)
$splitCnt = [Math]::Ceiling($recordCnt/$targetCnt)

$j = 0
for($i = 0; $i -lt $splitCnt; $i++) {
    # 分割するデータ分の配列を用意する
    $splitItems = $items[$j..($j+$targetCnt-1)]
    $splitDataCnt = $splitItems.count
    $J += $targetCnt
    Write-Host "Split count [${i}] Data count : [${splitDataCnt}]"
}

上記を実行すると下記のような結果が標準出力で出力されます。

Split count : [0] Data count : [10000]
Split count : [1] Data count : [10000]
Split count : [2] Data count : [10000]
Split count : [3] Data count : [10000]
Split count : [4] Data count : [10000]
Split count : [5] Data count : [10000]
Split count : [6] Data count : [10000]
Split count : [7] Data count : [10000]
Split count : [8] Data count : [10000]
Split count : [9] Data count : [10000]

問題なく分割できました。

最後に

REST APIなどのリクエスト先には基本的には最大許容サイズが設定されています。

大量データを連携したい場合には、この規定に引っかかるケースが多いので、このようにリクエストを分割して送信するなどの工夫が必要となります。

是非、ご参考までに。

タイトルとURLをコピーしました