1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
/** -------------------------------------------------------------------------------
* ファイルシステム:マスターファイルに対する変更データで変更更新処理の利用例
* 2015.09.19 作成 yoshi of CXMedia Inc.
* -------------------------------------------------------------------------------- */
// header関数を実行
header("Content-type:text/plain; charset=UTF-8");
// ファイルのパス指定
$trn_file_path = 'data/trans_data.csv'; //変更指示データのファイル
$mst_file_path = 'data/master_data.txt'; //マスターのファイル
// 変更指示データの存在チェック
if( !is_file($trn_file_path)){
echo "ERROR:{$trn_file_path}のファイルがありません";
exit;
}
// 変更指示ファイルの配列クリア
$trn_data = array();
// 変更指示データファイルの読み込み処理
$fh = fopen($trn_file_path,"r");
/* ---------------------------------------------------------------------------
* 変更指示データの読み込み:csv形式
* fgetcsv( handle [,length [,delimiter [,enclosure [,escape]]]])
* lengthの省略:最大行長制限なし、lengthの省略:","、escapeは、PHP5.3以降
* --------------------------------------------------------------------------- */
while (($data = fgetcsv($fh, 0, ",")) !== FALSE) {
$trn_data[] = $data;
}
// ファイル閉じる
fclose( $fh );
// マスターファイルの配列クリア
$mst_data = array();
// マスターファイルの更新処理
$fh = fopen($mst_file_path,"c+");
// --- 排他ロックの開始 ---
@flock($fh,LOCK_EX);
// マスターファイルのtab区切りで読み込み
while (($data = fgetcsv($fh, 0, "\t")) !== FALSE) {
$mst_data[] = $data;
}
//自動連番の最大値セット
$idx = count($mst_data);
$max_seq = $mst_data[$idx-1][0];
// 削除:del、変更:upd、追加:insのデータからマスターデータを更新
foreach ($trn_data as $data_ary){
$chg = array_shift($data_ary);
$id = $data_ary[0];
// 削除、変更データ指示のとき
if($chg == 'del' || $chg == 'upd'){
// マスターデータから該当するIDヒット検索
for($i=0;$i<count($mst_data);$i++){
if($id == $mst_data[$i][0]){
// 削除のとき、IDにdelをセット
if($chg == 'del'){
$mst_data[$i][0] = 'del';
}
// 変更のとき、更新日とデータ塗り替え
else {
// 更新日付のセット
$data_ary[9] = date('Y-m-d H:i:s');
$mst_data[$i] = $data_ary;
}
break;
}
}
}
// 追加データ指示のとき
elseif($chg == 'ins'){
$max_seq++;
$data_ary[0] = $max_seq;
// 更新日付のセット
$data_ary[9] = date('Y-m-d H:i:s');
$mst_data[] = $data_ary;
}
}
// ファイルポインタを先頭に戻す
rewind($fh);
// マスターファイルの更新:tab区切りの配列出力
foreach($mst_data as $data_ary){
// 削除データを出力しない
if($data_ary[0] != 'del'){
fputcsv($fh,$data_ary,"\t");
}
}
// --- ロックの解除 ---
flock($fh,LOCK_UN);
// ファイル閉じる
fclose( $fh );
echo "■処理完了「連番の最大値」$max_seq\n";
?>