毎度お世話になっております。
今夜も躓いてしまってどうにもならないので、お力をお貸しいただけませんでしょうか。
以下のようなリストファイルがあります。
------------------
項目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ランキング
-
クラスに配列を渡す方法
-
VBScript 配列
-
perl 初等プログラミングについて
-
Strawberry Perl for Windows ...
-
DataGridViewに配列の値を表示...
-
参照配列の要素数の求め方は?
-
Dim flag(4) as boolean で配列...
-
エクセルVBAでTransposeの不思議
-
Excel VBA ユーザーフォームの...
-
VBAのautofilter、criteriaの配...
-
VB6で配列の最大値を簡単に求め...
-
perlで2次元配列をサブルーチ...
-
リストボックスに縦スクロール...
-
文字の整列(printf)
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
VBのReturnの使い方
-
DoEventsが必要な理由について
-
pythonでファイルのコメント行...
-
DOSコマンドのループ内のTIMEコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
二次元配列のインデックスについて
-
リストボックスに縦スクロール...
-
Excel VBA ユーザーフォームの...
-
マクロ Publicでの配列定義
-
エクセルVBAでTransposeの不思議
-
二次元配列における要素数のは...
-
Strawberry Perl for Windows ...
-
perlで2次元配列をサブルーチ...
-
クラスに配列を渡す方法
-
Dim flag(4) as boolean で配列...
-
文字の整列(printf)
-
perlで配列の要素が空なのを知...
-
jcode->jfold で禁則処理
-
VB6で配列の最大値を簡単に求め...
-
perl 配列の要素数について
-
ファイル名に日付・時刻を付与...
-
チェックボックスのperlでの値...
-
組み合わせについての質問です...
-
配列を初期化する時ってどうす...
おすすめ情報