こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CSVファイルにあるメールアドレスの重複チェック

初めて投稿させていただきます、perl初心者です。
イベントの登録とデータ集計がしたくて、色々なメールフォームCGIを
比較検討しております。
今評価中のプログラムはデータをCSVにかき出してくれるのですが、メールアドレスの重複チェックが付いていません、そこでこのプログラムにメールチェック機能を追加したいと考え、色々見て廻ったのですが、良く分かりませんでした、
頭の中では書き出されたCSVファイルを読み込んでメールの列だけ抜き出し、それをチェックすれば良いのかなと考えています。
perlの本やohzakiさんのPerlメモ等も見ましたが良く分かりません。
何方か分かりやすく教えて頂けると助かります。

投稿日時 - 2009-09-11 15:25:52

QNo.5281081

困ってます

質問者が選んだベストアンサー

こんにちは、解決した?

評価中のプログラムはPerlなのかな?Perlでないのなら仕方ないけど。Perlなら、出力したCSVを再度読み込むよりも、評価プログラム自体のデータ変数を解析するのも手だと思うよ。下記は、ファイル'sample.csv'に、一行あたり"<名前>,<メアド>,<質問文>"の順にデータが格納されてる事を前提に話します。rush_2009さんの考えをなるべく素直にあらわしてみました。

---------- ここから ----------
01:  //===== Initialize =====
02:  %occurrence=();
03:
04:  //===== File open and read loop =====
05:  open FH, "sample.csv";
06:  while( $line = <FH> ) {
07:    ($name, $mail, $question) = split /\,/, $line;
08:
09:    //===== Check and branch =====
10:    if( exists $occurrence{$mail} ) {
11:      print "'$mail' is already exsists.\n";
12:    }
13:    else {
14:      print "$name,$mail,$question\n";
15:      $occurrence{$mail}=1;
16:    }
17:  }
---------- ここまで ----------

学校の宿題程度のスクリプトです。高効率化やデータ再利用などを考えた構成ではありませんが、参考にしてみてください。僕なら、もうちょっと用途に応じたデータベース変数を用意しますが、スクリプトや変数構成はそれだけ複雑になります。実際にプログラムを走らせてないので、つまんないバグがあるかもしれないですが、まあ、許してください。責任感なくて、ごめんね~(笑)。

投稿日時 - 2009-09-11 23:56:18

お礼

MAGNAFIFTYさま、ご丁寧に有難うございます。

分かりやすい説明でなんとなく分かったのですが・・・
仰るようにperlで書かれたデータ変数を解析をいましているところです。
またもう少し調べてからお聞きするかもしれませんが、
そのときにお時間の有るようでしたら宜しくお願いします。

投稿日時 - 2009-09-12 18:52:59

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

あいたたた、・・・英語力ですね(笑
Perlのコメントって//だっけ?ブツブツブツ

レス不要です。

投稿日時 - 2009-09-12 01:49:15

ANo.5

形はあってますが, おしむらくは英語が....>#4.
'$mail' is already exists.
は英語として間違ってまっせ.
'$mail' has already appeared.
あたりが適当かと.
'$mail' already exists.
でも意味は通りそうだけどちょっと変な感じ.

投稿日時 - 2009-09-12 00:17:56

ANo.3

>>1-2
ヒント:昔のokwave

回答もしておくか。

こうすればいい。これは
シーケンシャルサーチという高度なアルゴリズム


sub check{
 $flag = 0;
 $target = 'mail\アットマークmailtest.jp';
 $num = $#mail;
 for($i=0$i<$num;$i++){
  if(mail[$i] eq $target){
   $flag = 1;
  }
 }
 return $flag;
}

投稿日時 - 2009-09-11 22:05:36

補足

JavaJavax2さま、お名前からすると
これはJavaスクリプトなのですか?
ちょっと思いつきなのですが、登録フォームのメールアドレスの
項目にJavaスクリプトを直接付けてデータベースから全文をみて検索するという方法ないのでしょうか?
すみません、素人の思い付きです・・・

投稿日時 - 2009-09-12 19:06:17

お礼

JavaJavax2さま、
早速のご回答有難うございます。
未だよくは分かってはいないのですが、
試してみます。
有難うございます。

投稿日時 - 2009-09-11 23:32:48

ANo.2

普通はハッシュでしょうねぇ.
defined $counter{$mail_address} でハッシュ %counter のキーに $mail_address があるかどうかわかるので, あれば重複してるしなければ重複していない.

投稿日時 - 2009-09-11 18:04:54

お礼

Tacosanさま、早速のご回答有難うございます。
連想配列の勉強をもう少ししないといけないですね。
有難うございます。

投稿日時 - 2009-09-11 23:18:34

ANo.1

漠然としていて、よくわからないのですが、
メールだけを抜き出せるなら、
それをハッシュに突っ込みつつ、すでにハッシュに在るかどうかで
重複チェックは出来るんじゃないですね?

投稿日時 - 2009-09-11 16:30:50

補足

urakidsさま、早速のご回答有難うございます。
CSVのデータは
2009/9/10 13:14,80910-13142516,home,page,a,a,男性,1,123-4567,長野県,1,045-123-1234,home1@suv.com,home@suv.com
2009/9/10 13:18,80910-13181011,home,page,a,a,男性,1,123-4567,長野県,1,045-123-1234,home2@suv.com,home@suv.com
2009/9/10 13:30,90910-13303910,home,page,a,a,男性,1,123-4567,長野県,1,045-123-1234,home3@suv.com,home@suv.com
こんな感じのデータでそこからメールアドレスを抜き出せば簡単なのかなと考えました、
もう少し勉強してみます。
有難うございます。

投稿日時 - 2009-09-11 22:59:26

あなたにオススメの質問