
毎度お世話になっております。
今夜も躓いてしまってどうにもならないので、お力をお貸しいただけませんでしょうか。
以下のようなリストファイルがあります。
------------------
項目1
項目2
・・・
------------------
このリストにマッチした行を、リストの項目ごとにランダムに3行選んで出力したいです。
マッチした行を取り出すところまでは、以下のような形でできたのですが、
ここから先をどのように書けばいいのかわかりません。
------------------
my $list = 'リストファイル';
open (IN, "$list");
my %l;
while(<IN>) {
chomp;
$l{$_}++;
}
close IN;
while(<DATA>) {
my ($xx,$yy) = split(/\t/,$_);
if (exists($l{$xx})) {
# print;
# ここから先がわかりません
}
}
__END__
項目1 N1
項目1 N2
項目2 N3
項目2 N4
項目2 N5
項目1 N6
項目2 N7
項目2 N8
項目2 N9
項目1 N10
------------------
以下のような出力結果にしたいです。
------------------
項目1 N2
項目1 N6
項目1 N10
項目2 N3
項目2 N5
項目2 N9
------------------
どうぞよろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
「特定の項目を持つ配列」を作るには、別に split して連想配列にしなくても、
配列の要素から目的の条件に合う要素を抽出する grep を使えば1行で書けます。
あらすじはこんな感じ
my @items = <IN>;# (この行の上下のopen/closeは記述省略)
my @data = <DATA>;# 両方一気に読み込んじゃうことの是非は置いとく
map {
chomp;# 改行がついたままなので削る
my $pat = $_;# grep の中で $_ が使われるので別の変数にコピる
my @line = grep(/^$pat/, @data);# ここでマッチする行を抽出
# ここで回答 No.1 への補足にある、ランダム出力のループを使う
} @items;
# "map", "foreach (@items)", "while (<IN>)" のどれが好みかは置いとく
No.2
- 回答日時:
「ある配列からランダムに 3個の要素を表示する」ことはできるんだよね.
だとしたら, 「特定の項目を持つ配列」を作ればいい.
つまり, 今のプログラムとは逆に先にデータを読み込んで, 「リストファイル」からはあとで入力する.
No.1
- 回答日時:
「マッチする」かどうかはとりあえず脇に置いて, 「ファイルの内容をランダムに 3行表示する」ことはできますか?
この回答への補足
以下のように書いて、「ファイルの内容をランダムに 3行表示する」ことは一応できたのですが、
「項目ごとにランダムに 3行」がどうやったらいいのかわかりません・・・。
--------------------
@line = <DATA>;
for ($i = 0; $i < 3; $i++) {
$r = int(rand(@line));
$s = splice(@line,$r,1);
print $s;
}
__END__
項目1 N1
項目1 N2
項目2 N3
項目2 N4
項目2 N5
項目1 N6
項目2 N7
項目2 N8
項目2 N9
項目1 N10
--------------------
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) access フォーム 大分類、小分類 1 2022/08/11 18:03
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) Formulaプロパティーを使ってセルに数式を組んだのですが簡潔にしたい。 3 2022/08/21 20:51
- Excel(エクセル) ExcelVBAでリストの項目に必要数と同じ手配数を分配していくマクロを作りたいです。 1 2022/07/29 18:36
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- 専門学校 学校のパソコンの授業で「自分の好きなこと(趣味のあること)」をテーマに5分程度の発表があります。 前 2 2023/07/03 18:42
- Visual Basic(VBA) 【至急】 当方初心者です。 マクロについて知恵をお貸しください。 ★したい動作 ①リストE列2行目か 4 2022/09/29 18:56
- 運転免許・教習所 普通車AT限定で免許を取りに教習所に行っています。 今回技能講習6時間目だったのですが、今までは1回 2 2022/11/03 17:50
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラスに配列を渡す方法
-
二次元配列のインデックスについて
-
エクセルVBAでTransposeの不思議
-
VBA 二次元配列の1つ目を増...
-
一致する要素が格納されている...
-
VBScript 配列
-
VBAのautofilter、criteriaの配...
-
perl 配列の要素数について
-
Dim flag(4) as boolean で配列...
-
マッチした行をランダムに3行出...
-
二次元配列における要素数のは...
-
CSVの3行目だけを…
-
配列を初期化する時ってどうす...
-
フローチャートを教えてください
-
Excel VBA ユーザーフォームの...
-
VB6で配列の最大値を簡単に求め...
-
範囲指定したセルを1つずつ飛...
-
VBのReturnの使い方
-
Do whileでExitせず、ループの...
-
DOSコマンドのループ内のTIMEコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAでTransposeの不思議
-
VBAのautofilter、criteriaの配...
-
マクロ Publicでの配列定義
-
Excel VBA ユーザーフォームの...
-
チェックボックスのperlでの値...
-
リストボックスに縦スクロール...
-
Strawberry Perl for Windows ...
-
クラスに配列を渡す方法
-
二次元配列のインデックスについて
-
二次元配列における要素数のは...
-
文字の整列(printf)
-
Dim flag(4) as boolean で配列...
-
perl 配列の要素数について
-
複数の配列の全ての組み合わせ...
-
バイナリデータの検索(VB.NET2008)
-
perlで配列の要素が空なのを知...
-
可変長配列を、動的確保した固...
-
perl このテキストファイルを簡...
-
VBScript 配列
-
VB6で配列の最大値を簡単に求め...
おすすめ情報