Perlの質問です。メールアドレス($email)をCSVファイル($csvfile)から検索し、メールアドレスが存在した場合、その行を行ごと削除するにはどのように記述すればよいでしょうか?
お知恵をお借りできれば幸いです。

open(FILE, "<$csvfile");
@lines= <FILE>;
close(FILE);
for($x=0;$x <= $#lines;$x++){
my @HashTmp = split("\,",$lines[$x]);
$Hname{$HashTmp[0]} = $HashTmp[1];
}
if(exists($Hname{$email})){
open(OUT, "+<$csvfile");

# メールアドレスが存在する行を削除する

close(OUT);
}

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/04/17 04:32:40
  • 終了:2010/04/24 04:35:02

回答(0件)

回答はまだありません

  • id:punitan
    こんな感じでいかがでしょうか?
    http://gist.github.com/368965

    #!/usr/bin/perl

    use strict;
    use utf8;
    use Encode;

    open (my $in, '<', 'source.csv') or die $!;
    my @csv = <$in>;
    close $in or die $!;

    my $email = 'example@example.com';
    my @data;

    for (@csv) {
    my $line = decode_utf8 $_;
    my @column = split /,/, $line;
    push @data, $line unless ($column[0] eq $email);
    }

    open (my $out, '>', 'output.csv') or die $!;
    for (@data) {
    print {$out} encode_utf8($_);
    }
    close $out or die $!;

    __END__
  • id:GreenStar
    間接回答拒否設定が厳しくて回答できないんですがコメントで
    (他にも書き方ありますが、これが一番理解しやすいかと・・・。)


    メアドがあれば行を削除するという方式です。
    # 読み込み
    open(FILE, "< $csvfile");
    @lines = <FILE>;
    close(FILE);
    # 書き込み
    open(OUT, "> $csvfile");
    print OUT grep(!/$email/, @lines);
    close(OUT);


    メアドが二列目にある場合のみとする場合は正規表現を下記に変えます。
    print OUT grep(!/.*?,$email,/, @lines);
  • id:icta
    punitanさん、GreenStarさん、ご回答ありがとうございました。希望通りの動作を確認できました。
    grepでこんなに簡単に実現できてしまうとは驚きでした。
    貴重なお時間を割いていただき本当に感謝しております。ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません