![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
以下のようなデータ(CSV)があったとします。
1020,大森,3249
1023,高橋,3252
1020,大森,3249
ここで1020が重複しているので重複させないように
printしたいと考えています。ほかにも多数のデータ
が重複しているかも知れない。
本を見て、ハッシュのキーは重複しない
ことを利用して
foreach (@man){
$H{$_}=1; #値は無視しキーにセット
}
@man = keys %H; #ハッシュキーを配列へ
foreach $eachman (@man) {
($num, $name, $encpass) = split(/,/, $eachman);
print ・・・・
・・・・
のように作ってみましたが、重複されて
表示されます。順番のみ変わっていました。
このような感じで簡単にできる方法がありましたら
教えてください。
No.3ベストアンサー
- 回答日時:
質問を勘違いしているかもしれませんが、%H or %tmpを活かせばもっとシンプルになると思います。
my %tmp;
while (<DATA>) {
chomp;
my ($num, $name, $encpass) = split /,/;
if (!$tmp{$num}++) {
print "$num:$name\n";
}
}
__END__
1020,大森,3249
1021,塚本,3250
1022,播磨,3251
1023,高橋,3252
1024,周防,3253
1025,沢近,3254
1023,高橋,3252
1020,大森,3249
1023,高橋,3252
1024,周防,3253
参考URL:http://www.meibin.net/reference/books/perl2/cook …
回答ありがとうございました。
while (<DATA>) を使う方法ですが、どうして止まるか原因がわかりました。
別ルーチンでopen TXT 、・・・みたいなことをやって配列にTXTの内容を入れてしまっています。
while(<>)<>の部分が配列ではダメなんですよね?試してみましたがダメでした。
No.4
- 回答日時:
> while(<>)<>の部分が配列ではダメなんですよね?試してみましたがダメでした。
配列に対してその要素を列挙しつつ操作をするのなら
for $var (@arrary) または foreach $var (@array)
を使います。
$var は省略できて、その場合は $_ で各要素が参照できます。
あと念のため解説しておきますが、DATAというファイルハンドルは
openしないでも使うことができて、どこからデータを持ってくるのかというと、
スクリプトの末尾、__END__の後におかれた行です。
No.2
- 回答日時:
> whileの文があると途中で処理が終わっちゃうみたいでHTMLが最後まで表示されない現象が起こりました。
これはなにやらよくわかりませんが、
> ただ、データが完全一致していないと重複チェックが消えないようで、
> 1列目をキーにできればいいのですが、その方法はあるでしょうか?
ということであれば、
foreach (@man){
$H{$_}=1;
}
このループを
foreach (@man){
my $num;
($num, undef) = split(/,/, $_, 2);
$H{$num}=$_;
}
としてやって、
foreach $eachman (sort keys %H) {
($num, $name, $encpass) = split(/,/, $H{$eachman});
でどうでしょう?
この場合先頭のエントリが同じものは最後に登場したものが有効になります。
2回同じ文字でsplitするのはいやらしいですが、わかりやすさを優先ということで。
回答ありがとうございました。
おかげさまで出来ました。2回Splitするのは改善できればいいですけど、私には無理そうですが、勉強してみます。
No.1
- 回答日時:
基本的な考え方は間違ってはいないと思います。
試しに提示されたコード片を元にスクリプトを組んでみましたが正しく動いています。
ハッシュにためたデータを配列に書き戻してますけど、
似たような別の名前の変数に入れちゃってるなんてことは
ありませんか?
use strict;
use warnings;
my %tmp;
my @table;
while (<DATA>) {
chomp;
push @table, $_;
}
foreach (@table){
$tmp{$_} = 1;
}
foreach my $entry (sort keys %tmp) {
my ($num, $name, $encpass) = split(/,/, $entry, 3);
print "$num:$name\n";
}
__END__
1020,大森,3249
1021,塚本,3250
1022,播磨,3251
1023,高橋,3252
1024,周防,3253
1025,沢近,3254
1023,高橋,3252
1020,大森,3249
1023,高橋,3252
1024,周防,3253
実行結果:
1020:大森
1021:塚本
1022:播磨
1023:高橋
1024:周防
1025:沢近
この回答への補足
回答ありがとうございました。
書かれてあるとおりやってみると、
whileの文があると途中で処理が終わっちゃうみたいでHTMLが最後まで表示されない現象が起こりました。
で、こんな感じで組んでみたんですけど
#while (@man) {
#chomp;
#push @table, $_;
#}
foreach (@man){
$H{$_}=1;
}
#@table = keys %H;
foreach $eachman (sort keys %H) {
($num, $name, $encpass) = split(/,/, $eachman);
近いところまでいきました。
ただ、データが完全一致していないと重複チェックが消えないようで、1列目をキーにできればいいのですが、その方法はあるでしょうか?
実はデータは、
1020,大森,3249,5,8,0,,,,,
みたいに後ろが続いてまして申し遅れましたm(__)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 重複データの抽出について 2 2023/07/21 14:52
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Excel(エクセル) エクセルで重複データを行ごとに抽出したい 4 2022/12/05 08:18
- Excel(エクセル) Excel2019 列と列(2列)の数値の重複を調べたい 1 2023/05/11 13:35
- Excel(エクセル) 【Excel】指定した文字列に該当する行を重複しないようにリスト 3 2022/03/30 12:27
- IT・エンジニアリング ドメイン駆動設計の値オブジェクトについて質問 1 2023/05/13 02:50
- Excel(エクセル) エクセルでフィルタ後の列の重複を回避したい 6 2022/10/13 12:50
- Excel(エクセル) [Excel2016] 相関表等の自動作成 2 2022/08/01 20:34
- Excel(エクセル) Excel 条件付き書式について 1 2022/12/14 20:38
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
Perlで、「が」を、「...
-
このファイルを開く方法で困っ...
-
perlのflock関数でロックをかけ...
-
perl 正規表現でエラー
-
P.Cのシングルチューナーとダブ...
-
perl LWPでURLにアクセスした時...
-
PerlでUTF-8のファイルの文字列...
-
AI sisterとは、偽物の人ですか?
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
Perlで特定文字列から特定文字...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
if($key){ ($key eq 'aaa') ||...
-
双方向リスト(?)
-
HTML::TemplateのTMPL_LOOPにつ...
-
連番ごとに印をつける
-
変数に何も入ってないとき
-
Perlのリファレンスについて
-
ハッシュを無名変数へ代入して...
-
VB6の公式リファレンスはありま...
-
bashのリファレンス的なWEB...
-
DBIを使用してデータを連想配列...
-
重複する値を表示しない
-
クラスの作り方
-
Perl構造体、出力方法
-
ハッシュの配列を作ることは可...
-
Yahooの掲示板のような掲示板を...
-
ファイルからデータを読み込ん...
-
Perlで縦横変換のような事をし...
-
サブルーチンの返値に配列のハ...
-
構造体の配列の指定方法
-
C言語について。
おすすめ情報