何をしたいん?
- MariaDBをレプリケーションしてる。
- プライマリとセカンダリ間で正常にレプリケーションできてるか確認したい。
- プライマリとセカンダリの両方からmysqldumpしたファイルをWinMergeで差分チェックしよう!
- 1ファイルあたりの行数多すぎるとWinMergeで比較できない…(´・ω・`)
ということで、mysqldumpしたファイルを指定行数で分割したいわけどす。
コピペで使えるスクリプト
先頭の『ファイルパス』『エンコード』『分割行数』を書き換えて、PowerShellに貼り付ければ使えるやつを作ってみました。
$file_path = 'ファイルパス';
$encode = 'UTF8'; #SJISなら『default』
$row_size = 100; #分割行数
$file_name = $(Get-ChildItem $file_path).BaseName;
$file_extenstion = [System.IO.Path]::GetExtension($file_path);
$parent_folder_path = Split-Path $file_path -parent;
$i = 0;
cat $file_path -ReadCount $row_size -Encoding $encode | % {
$tmp_file_path = $parent_folder_path + '\tmp' + $i + $file_extenstion;
$output_file_path = $parent_folder_path + '\' + $file_name + '_' + $i + $file_extenstion;
$_ > $tmp_file_path;
get-content -Encoding Unicode $tmp_file_path | Set-Content -Encoding $encode $output_file_path;
Remove-Item $tmp_file_path;
$i++;
}
このスクリプトのちょっとダメなとこ
- エンコードし直しの為に一時ファイルに出力してる。(tmpという名前のファイルは分割できない)
- 分割元のファイルのエンコードは『UTF8』『SJIS』のみ対象。
- 分割後のファイルと同名のファイルがあったら上書きされちゃう。
ちょっとスマートじゃないなあ…(´・ω・`)
あくまで個人用のぷちツールです。
実行するとこんな感じ
- 分割元のファイルと同じフォルダに分割後のファイルが作成されます。
- 分割元のファイルはそのまま残ります。
- 分割元のファイル名と拡張子を引き継いでファイルを分割します。
- 分割後のファイル名には通し番号が付きます。
何で一時ファイルに出力してからエンコードし直してるの?
- PowerShellのデフォルトのエンコードはUTF-16。
- 上記の為に
$_ >
の箇所で出力されるファイルのエンコードはUTF-16になってしまう。 - パイプ処理の中でエンコードを指定すればいいんだろうけど、やり方分からんかった…(´・ω・`)
妥協して一時ファイル出力してます。
蛇足
汎用性持たせたり例外処理も盛り込みたいならC#でexe作った方がいいと思います。
バージョン
Windows10 Pro バージョン20H2 OSビルド19042.685
PSVersion 5.1.19041.610