てぃーだブログ › 作る人 (つくるんちゅ)日記 › CGI FLASH JavaScript › CGIでエクセルデータの重複削除



2009年01月31日

CGIでエクセルデータの重複削除

最近、エクセルのデータの重複チェックをする機会が多い。
住所録とか、pingサーバー一覧とか…。

エクセルもすごく便利なソフトだけど、時々融通が利かない時もある。
調べたいデータを左端に持ってきてソートして、見えなくしてとか、結構ややこしい。

というわけで、Perlでスクリプトを作ってみた。

▼ こんな感じです。(一応これ、ちゃんと使えます)


▲見えない場合はこちら

重複チェックが終わったら、再びコピーペーストでエクセルに書き戻せばOK。

ごく簡単なスクリプトなんで、無料配布にしておきます。解る方は適当に改造して使ってください。
冗長なんで、もっとシンプルな書き方があったら、教えてくれるとうれしいです。

以下、ソース。
      ダウンロード用圧縮データ

---------------------------------------------------------------------------------------
#! /usr/bin/perl

use CGI::Carp qw(fatalsToBrowser);

#┌──────────────────────────────────
#│ xls_sort.cgi v1.00 (2009 01/31)
#│ つくるんちゅ http://making.ti-da.net
#└──────────────────────────────────

sub setumei { ##このCGIの説明 ////////////////////////////////////////
print << "EOL";
■目的
エクセルの画面をコピペで貼り付けると、各列で重複チェックして表示

EOL
} #///////////////////////////////////////////////////////////////////

# 初期設定 -----------------------------------------------------------
$script = 'xls_sort.cgi'; #スクリプト名
$tetle = "重複チェックCGI"; #名称
# --------------------------------------------------------------------
¶ #パラメータ&デコード

&main;

sub main { ## メイン処理 ---------------------------------------------
&header;

$dat = $in{'xls'};
$key1 = $in{'key'};
$key1 =~ s/番目//g;
$key = $key1-1;

foreach ( split(/\n/,$dat) ) {push (@dat,"$_");}
@dat = sort { (split(/\t/,$a))[$key] cmp (split(/\t/,$b))[$key] } @dat;

foreach (@dat) {
($no1,$no2,$no3,$no4,$no5,$no6,$no7,$no8,$no9,$no10,) = split(/\t/);

if($key eq 0){if($no1 && $no1 eq $no1b) { next; }}
if($key eq 1){if($no2 && $no2 eq $no2b) { next; }}
if($key eq 2){if($no3 && $no3 eq $no3b) { next; }}
if($key eq 3){if($no4 && $no4 eq $no4b) { next; }}
if($key eq 4){if($no5 && $no5 eq $no5b) { next; }}
if($key eq 5){if($no6 && $no6 eq $no6b) { next; }}
if($key eq 6){if($no7 && $no7 eq $no7b) { next; }}
if($key eq 7){if($no8 && $no8 eq $no8b) { next; }}
if($key eq 8){if($no9 && $no9 eq $no9b) { next; }}
if($key eq 9){if($no10 && $no10 eq $no10b) { next; }}

$lno = "$no1\t$no2\t$no3\t$no4\t$no5\t$no6\t$no7\t$no8\t$no9\t$no10<,>";
$lno =~ s/\t*<\,>/\n/g;
$lno2 .= "$lno";

$no1b = $no1;
$no2b = $no2;
$no3b = $no3;
$no4b = $no4;
$no5b = $no5;
$no6b = $no6;
$no7b = $no7;
$no8b = $no8;
$no9b = $no9;
$no10b = $no10;

}

print << "EOL";
以下のフォームにエクセルのデータをコピーペーストして、<br>
チェックする列のボタンを押してください。
<form id="form1" name="form1" method="post" action="$script">
<input type="submit" name="key" value="1番目" />
<input type="submit" name="key" value="2番目" />
<input type="submit" name="key" value="3番目" />
<input type="submit" name="key" value="4番目" />
<input type="submit" name="key" value="5番目" />
<input type="submit" name="key" value="6番目" />
<input type="submit" name="key" value="7番目" />
<input type="submit" name="key" value="8番目" />
<input type="submit" name="key" value="9番目" />
<input type="submit" name="key" value="10番目" />
<br>
<textarea style=\"width: 700px; height: 400px;\" name="xls" id="xls">$lno2</textarea><br>

</form>
EOL
if($key1){print "$key1番目の項目でソ\ート&重複チェックしました。";}
&footer;
exit;
}

sub para { ## パラメータ&デコード ----------------------------------
use CGI qw(:standard);
@pairs=param();
foreach (@pairs) {
$in = param("$_");
$in =~ s/\r\n|\r|\n/\n/g;
$in{$_} = $in;
}}

sub header { ## ヘッダー ---------------------------------------------
print "Content-type:text/html\n\n";
print << "EOL";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>$tetle</title>
</head>

<body>
EOL
}
sub footer { ## フッター ---------------------------------------------
print << "EOL";
</body>
</html>
EOL
}






同じカテゴリー(CGI FLASH JavaScript)の記事



この記事へのコメント
エクセルで重複チェックを簡単にする方法を探してたら
ここにたどり着きました。

とても簡単に使えて、便利で助かりました!
ありがとうございます。
また活用させてもらいます^^
Posted by ぱる at 2009年03月28日 12:47
コメント・サンキューです。
お役に立てて何よりです。
Posted by IGUIGU at 2009年03月31日 11:08
※このブログではブログの持ち主が承認した後、コメントが反映される設定です。
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

※記事内容に言及無いコメントは、コメントスパムと判断して削除する場合があります。