ファイル間重複除去を行うPerlScript
LineCompare

管理人が生まれて初めて書いたプログラム記念すべき第一号(笑)
data.txtとdeletedata.txtとの重複行をdata.txtから差し引いた結果をresult.txtに出力します。

data.txt
dog
cat
lion
tiger
bird
light
tree
bird
snow
sea
tree
diamond
biohazard
bird
cat
sea
-
deletedata.txt
biohazard
sea
bird
cat
tree
snow
cat
sea
bird
cat
biohazard
tree
snow
cat
sea
tree
=
result.txt
diamond
dog
light
lion
tiger

その際ファイル内重複を自動で行いますが、ファイル内重複除去には5つの重複までしか対応
してません。
ですが、5個以上ファイル内重複している事はめったにないのでこれで十分だと思います。
それでもファイル内重複除去の数を増やしたい場合はスクリプトの以下の赤文字部分を改変
してください。
赤文字のループ部分を増やせば増やすほどファイル内重複に対応していきます。
なお、Perlで書かれているのでActiveState社のActivePerlがインストールされていないと動作
しません。
下記のサイトよりダウンロードしてお使いください。
http://www.activestate.com/

感想
data.txtとdeletedata.txtの内容を比較するにあたり二つのファイルを結合して比較する方法を発案しました。なぜなら、二つのファイルの配列を直接比較して処理させる方法がおもいつかなかったからです。二つのファイルを合体させた際、もしdeletedata.txtにある内容がdata.txtにも存在するならば同じ重複したデータが出現する事に目をつけました。だとしたらファイル間重複除去はファイル内重複除去と必然的に同じ事になっちゃいます。
data.txtとdeletedata.txtを合体させた後重複するデータを消し去ってresult.txtに出力すればいいのです。ところが予期せぬ事が起こりました。
data.txtには無くてdeletedata.txtには存在するデータをも出力しちゃったのでした。
合体したら重複せんので当然ですがきずきませんでした。
そこで、deletedata.txtを二回足す事にしました。これで全てうまくいきましたが、
現段階では日本語(ひらがな・漢字)には全く対応してません。よって半角英数字だけのデータしか扱えません。暇な時日本語データにチャレンジしてみます。
なお、各ファイルのデータ数には制限がございませんのでdata.txtやdeletedata.txtに何万行格納されようとも動く、、、、、と思います。
僕の実験では10000行と10000行のファイル間重複除去を一瞬で出力しました。
10000行と10000行のファイル間重複除去、、、人間には無理やな、、、こんな作業。(笑)



open (PRE,">>data.txt");
@pre=<PRE>;
seek (PRE,0,2);
print PRE "\n";
close(PRE);
open (PREA,">>deletedata.txt");
@pre2=<PREA>;
seek (PREA,0,2);
print PREA "\n";
close(PREA);
open (DATA,"<data.txt");
@array=<DATA>;
$list=@array;
#push (@array,"TEMP");
open (DATA2,"<deletedata.txt");
@array2=<DATA2>;
$list2=@array2;
#push (@array2,"TEMP");
open (DATAS,">>datatemp.txt"); #ファイル内重複除去処理の開始
open (DATAS2,">>datatemp2.txt");
@array_s=sort @array;
@array2_s=sort @array2;
$array_s=@array_s;
$array2_s=@array2_s;
$max=@array_s;
foreach ($t=0; $t<$max; $t++){
if ("$array_s[$t]" eq "$array_s[$t+1]"){
print DATAS "$array_s[$t]";}
else {
print DATAS "$array_s[$t]";}}
$max=@array2_s;
foreach ($t=0; $t<$max; $t++){
if ("$array2_s[$t]" eq "$array2_s[$t+1]"){
print DATAS2 "$array2_s[$t]";}
else {
print DATAS2 "$array2_s[$t]";}}
close(DATAS);
close(DATAS2);

open (DATATEMP,"<datatemp.txt");
@array1m=<DATATEMP>;
close(DATATEMP);
open (DATATEMP2,"<datatemp2.txt");
@array2m=<DATATEMP2>;
close(DATATEMP2);
open (ABC,">>abc.txt");
open (DE,">>de.txt");
@abc=sort @array1m;
@de=sort @array2m;
$abc=@abc;
$max=@abc;
foreach ($t=0; $t<$max; $t++){
if ("$abc[$t]" eq "$abc[$t+1]"){
$abc[$t+1]="";}}
print ABC @abc;
$de=@de;
$max=@de;
foreach ($t=0; $t<$max; $t++){
if ("$de[$t]" eq "$de[$t+1]"){
$de[$t+1]="";}}
print DE @de;
close(ABC);
close(DE);

open (LPF,">>LPF.txt");
open (CEH,">>CEH.txt");
@LPF=sort @abc;
@CEH=sort @de;
$LPF=@LPF;
$max=@LPF;
foreach ($t=0; $t<$max; $t++){
if ("$LPF[$t]" eq "$LPF[$t+1]"){
$LPF[$t+1]="";}}
print LPF @LPF;
$CEH=@CEH;
$max=@CEH;
foreach ($t=0; $t<$max; $t++){
if ("$CEH[$t]" eq "$CEH[$t+1]"){
$CEH[$t+1]="";}}
print CEH @CEH;
close(LPF);
close(CEH);

open (JBA,">>JBA.txt");
open (LHR,">>LHR.txt");
@JBA=sort @LPF;
@LHR=sort @CEH;
$JBA=@JBA;
$max=@JBA;
foreach ($t=0; $t<$max; $t++){
if ("$JBA[$t]" eq "$JBA[$t+1]"){
$JBA[$t+1]="";}}
print JBA @JBA;
$LHR=@LHR;
$max=@LHR;
foreach ($t=0; $t<$max; $t++){
if ("$LHR[$t]" eq "$LHR[$t+1]"){
$LHR[$t+1]="";}}
print LHR @LHR;
close(JBA);
close(LHR);

open (PHF,">>PHF.txt");
open (PRH,">>PRH.txt");
@PHF=sort @JBA;
@PRH=sort @LHR;
$PHF=@PHF;
$max=@PHF;
foreach ($t=0; $t<$max; $t++){
if ("$PHF[$t]" eq "$PHF[$t+1]"){
$PHF[$t+1]="";}}
print PHF @PHF;
$PRH=@PRH;
$max=@PRH;
foreach ($t=0; $t<$max; $t++){
if ("$PRH[$t]" eq "$PRH[$t+1]"){
$PRH[$t+1]="";}}
print PRH @PRH;
close(PHF);
close(PRH);       #ファイル内重複除去処理の終了

open (DATA3,">>temp.txt"); 
print DATA3 @PHF;
seek(DATA3,0,2);
print DATA3 @PRH;       #deletedata.txtを二回合体!
seek(DATA3,0,2);
print DATA3 @PRH;       #deletedata.txtを二回合体!の終了
close(DATA);
close(DATA2);
close(DATA3);

open (DATA4,"<temp.txt");
@array3=<DATA4>;
@data3s=sort @array3;
close(DATA4);
open(DATA5,">temp2.txt");
print DATA5 @data3s;
close(DATA5);
open(DATA11,"<temp2.txt");
@line=<DATA11>;
$line=@line;
close(DATA11);
open (DATA15,">temp2.txt");
$max=@data3s;
foreach ($i=0; $i<$max; $i++) {
if ("$line[$i]" eq "$line[$i+2]"){
$line[$i]="\n";
$line[$i+1]="\n";
$line[$i+2]="\n";}}
foreach ($t=0; $t<$max; $t++) {
if ("$line[$t]" eq "$line[$t+1]"){
$line[$t]="\n";
$line[$t+1]="\n";}}
print DATA15 @line;
close(DATA15);
unlink "temp.txt";
rename <temp2.txt>,<temp.txt>;
open (DATA15,"<temp.txt");
@array15=<DATA15>;
@data15s=sort @array15;
close(DATA15);
open(DATA15,">temp2.txt");
print DATA15 @data15s;
close(DATA15);
open(DATA11,"<temp2.txt");
@line2=<DATA11>;
$line2=@line2;
close(DATA11);
open (DATA15,">temp2.txt");
$max=@data15s;
foreach ($i=0; $i<$max; $i++) {
if ("$line2[$i]" eq "$line2[$i+1]"){
$line2[$i]="";
$line2[$i+1]="";}}
print DATA15 @line2;
close(DATA15);
unlink "temp.txt";
unlink "abc.txt";
unlink "de.txt";
unlink "datatemp.txt";
unlink "datatemp2.txt";
unlink "CEH.txt";
unlink "JBA.txt";
unlink "LHR.txt";
unlink "LPF.txt";
unlink "PHF.txt";
unlink "PRH.txt";
rename <temp2.txt>,<result.txt>;


ダウンロード