PHPで固定長ファイルを作るときのメモ。
まずは、各項目を固定長で作る方法。
sprintf()を利用する
まずは定番sprintf()。便利ですが応用範囲が狭い。
$num = 123;
//00000123
echo sprintf("%08d", $num)."<br>";
str_pad()を利用する
基本的にはstr_pad()を利用することになるかと。
数字
0埋め。埋める方向をLEFT, RIGHT, BOTHなど指定できる。
$num = 123;
//00000123
echo str_pad($num, 8, '0', STR_PAD_LEFT)."<br>";
//12300000
echo str_pad($num, 8, '0', STR_PAD_RIGHT)."<br>";
//00123000
echo str_pad($num, 8, '0', STR_PAD_BOTH)."<br>";
英数字
str_pad()というくらないので普通の文字でも同じ。
$str = "hoge";
//xxxxhoge
echo str_pad($str, 8, 'x', STR_PAD_LEFT)."<br>";
//hogexxxx
echo str_pad($str, 8, 'x', STR_PAD_RIGHT)."<br>";
//xxhogexx
echo str_pad($str, 8, 'x', STR_PAD_BOTH)."<br>";
日本語(バイトを合わせる)
鬼門の日本語。普通にstr_pad()にかけるとバイト数換算で計算される(当然)。
$mb_str = "ほげ";
//xxほげ
echo str_pad($mb_str, 8, 'x', STR_PAD_LEFT)."<br>";
日本語(字数を合わせる)
日本語(全角)における文字数を合わせる場合はstr_pad()では不可能。str_repeat()+"文字列"で長めに文字列を生成しておいてmb_substr()で必要な文字列を頭から、あるいはお尻から切り取ることで擬似的にstr_padを実現する。
//んんんんんんほげ
echo mb_substr(str_repeat("ん",8).$mb_str,-8)."<br>";
//ほげんんんんんん
echo mb_substr($mb_str.str_repeat("ん",8),0,8)."<br>";
出力する
CSV出力だとfputcsv()とかを使うのだろうけど、デリミタやエンクロージャはいらないので普通に書き込む。
めんどいのでここではfile_put_contents()を利用している。
//ファイル出力
//大きなファイルの場合はcursorとかchunkとかを利用
for($i=0; $i<10; $i++){
$row = str_pad($num, 8, '0', STR_PAD_LEFT).
str_pad($str, 8, 'x', STR_PAD_LEFT).
mb_substr(str_repeat("ん",8).$mb_str,-8).
"\n";
file_put_contents("test.txt",$row,FILE_APPEND);
}