🙆‍♀️

【powershell】大量のタブ区切りデータを作成する

2022/12/22に公開

はじめに

DBに大量のデータを準備したく、大量のinsert文を準備しようと考えていたが、「そもそも直接csvファイルを読み込んだ方が手間省けない??」と考えられる状況だったので、大量のタブ区切りデータをPowerShellスクリプトにて作成する方法をメモ。

内容

方法は非常に単純で、for文で繰り返しデータを作成していくだけだが、処理時間やデータファイルの容量との兼ね合いもあり、ひと工夫加えている。

# 作成するデータファイル名の前半
$fileNameHead = "dataFile_"
# 作成するデータファイル名の拡張子
$fileExt = ".csv"
# ファイルへのデータ出力処理を行うデータ数の間隔
$dataPerWrite = 1000
# 1ファイルあたりのデータ数
$dataPerFile = 500000
# データ数
$dataNum = 1500015
# データの元となる項目
$outDataBase = @("1", "テスト項目1", "テスト項目2")

# データ書き込み用変数
$outData = ""
for($i = 1; $i -le $dataNum; $i++){
  # 書き込むデータの作成
  $outDataBase[0] = [String]$i
  $outDataTmp = $outDataBase -join "`t"
  $outData = $outData + $outDataTmp
  
  # 書き込むデータ数に到達した、または最後のループの場合
  if(($i % $dataPerFile -eq 0) -Or ($i -eq $dataNum)){
    # データを書き込む
    $fileName = $fileNameHead + [Math]::Ceiling($i / $dataPerWrite) + $fileExt
    Add-Content $fileName $outData
    
    # データの初期化
    $outData = ""
  }else{
    # 改行コードを末尾に付け足す
    $outData = $outData + "`r`n"
  }
}

詳細

基本的に書いていることそのままだが、一定データ間隔$dataPerWriteごとに書込み処理を行っている。
こうすることで、1データずつ書き込むよりも処理時間が早くなっている。

また、データファイルに関しても容量が大きくなりすぎるとファイルの中身を確認する際にあまりに重くてファイルが開かない等、良くない事象が高確率で起こりうるので、書き込みデータ数の上限$dataPerFileを設定している。(今回は500000。)

勿論、書き込むデータはデータベースのテーブルに応じて、主キーの値が被らないようずらしていく必要がある。
今回はループの回数$iをそのまま主キーとして用いることが出来る状況だったのでそうした。

まとめ

なかなか使う機会が限定的だが、同じ状況が訪れた際にスムーズにできるようメモをした。
最近自分の記事を振り替えれていないので、定期的にそのような機会を設けるのも良いのではないかと思った。

Discussion