2つのデータを統合を効率よく出来ません
2つのデータを統合を効率よく出来ません
2つのデータを統合するプログラムをperlで作成しています。
データはテキストでサーバー環境にあります。
クラスデータ
1,1-1,1年
2,1-2,1年
3,1-3,1年
4,2-1,2年
5,2-2,2年
6,3-1,3年
7,3-2,3年
名前データ
1,田中,たなか
2,伊藤,いとう
3,斎藤,さいとう
4,上野,うえの
5,大阪,おおさか
6,福島,ふくしま
7,矢部,やべ
最終データ
1,田中,たなか,1-1,1年
2,伊藤,いとう,1-2,1年
3,斎藤,さいとう,1-3,1年
4,上野,うえの,2-1,2年
5,大阪,おおさか,2-2,2年
6,福島,ふくしま,3-1,3年
7,矢部,やべ,3-2,3年
以下のプログラムで動作させていますが、件数が多くなると非常に非効率となり動作しなくなります。
※公開用にプログラムを修正しています。おかしい部分があるかもしれません。
(ここから)
略・・・
open(DB10,"<$namefile") || next;
flock(DB10, 1);
@lines10 = <DB10>;
close(DB10);
foreach $lines10 (@lines10) {
($seq,$name,$kana,$classnew,$nennew) = split("<>", $lines10);
open(DATA,"$classfile")|| die &error(" $classfile を読み込みopen出来ません");
flock(DATA,1);
@lines11 = <DATA>;
close(DATA);
foreach $lines11(@lines11){
($seq1,$class,$nen) = split("<>", $lines11);
$classnew = $class;
$nennew = $nen;
open(DATA1,"$classfile")|| die &error(" $classfile を読み込みopen出来ません");
flock(DATA1,1);
@line21 = <DATA1>;
close(DATA1);
foreach $line21(@line21){
local(@val) = split("<>", $line21);
if($seq1 == $val[0]){ $line21 ="";}
push(@new,"$line21");
}
push(@new,"$seq1<>$class<>$nen\n");
open(DATA1,">$classfile")|| die &error(" $classfile をwrite出来ません ");
flock(DATA1,2);
print DATA1 @new;
close(DATA1);
@new = "";
}
@new1 = "";
open(DB12,"<$namefile") || &error("Can't open $namefile");
flock(DB12, 1);
@line12 = <DB12>;
close(DB12);
foreach $line12 (@line12) {
local(@val1) = split("<>", $line12);
if($seq == "$val1[0]"){ $line12 ="";}
push(@new1,"$line12");
}
push(@new1,"$seq<>$name<>$kana<>$classnew<>$nennew<>\n");
open(DB12,">$namefile")|| die &error(" $namefile をwrite出来ません ");
flock(DB12,2);
print DB12 @new1;
close(DB12);
}
}
(ここまで)
プログラムの流れとしては(私が解釈している)、2つのファイルを1件読み込み更新を最終行へ毎回行っているというものになります。
恐らく、もっと効率の良い方法があるとは思っているのですが、アイデアが浮かばす止まってしまいました。
このプログラムではなく別のものでもOKです。私がこの方法しかしらないのでこの記述をしています。
ファイルの更新系でアドバイスがいただけたらと思い書き込みます。
ご指導よろしくお願いいたします。
お礼
回答ありがとうございます。 今、確認しましたら、エラーとならずに途中で停止する形となりました。 ちゃんとした説明でなく申し訳ございません。