はじめまして、皆様のお知恵を拝借したく投稿しました。
よろしくお願いします。
perlでのデータ処理で入力ファイルが
---------------------------------
start end
1 4
6 10
12 16
14 20
22 25
---------------------------------
となっている場合、4行目の開始位置が3行目の終了位置よりも
前になっているデータがあるとします。
(領域14~16までが領域が重複しているという意味です)。
この重複している領域部分を統合して
---------------------------------
start end
1 4
6 10
12 20
22 25
---------------------------------
と再出力できるようにperlでコーディングしたいのですが
どのようにしたらよいのでしょうか?
ご助言いただけますと幸いです
No.1ベストアンサー
- 回答日時:
単に「ある区間の開始位置が別の区間の終了位置より前にあったら (適切に) マージする」だけかなぁ? 動いているような気はするけどちょっと不安. あと, 「区間」の考え方によっては変更が必要です.
#!/usr/bin/perl
my @ranges = (
[1, 4],
[6, 10],
[12, 16],
[14, 20],
[22, 25],
);
my @results;
@ranges = sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] } @ranges;
my $theRange = shift @ranges;
for my $range (@ranges) {
if ($theRange->[1] < $range->[0]) {
push @results, $theRange;
$theRange = $range;
} elsif ($theRange->[1] < $range->[1]) {
$theRange->[1] = $range->[1];
}
}
push @results, $theRange;
for my $range (@results) {
print "$range->[0] $range->[1]\n";
}
なるほど、二次元配列を使う手があるのは気がつきませんでした。
早速のご回答ありがとうございます。
ご参考の意見を基に早速試してみます。
取り急ぎ御礼まで
No.2
- 回答日時:
start と end の中間の数字も1つの配列に入れ、並べ替えて、隣り合う2つの数字を比較して、
差が 2 以上ある場合は、前の数字を範囲の終わり、後の数字を範囲の始まりとして出力しています。
use strict;
my @list = (1 .. 4, 6 .. 10, 12 .. 16, 14 .. 20, 22 .. 25);
@list = sort { $a <=> $b } @list;
print "$list[0] ";
my $p = $list[0];
foreach my $n (@list[1 .. $#list]) {
print "$p\n$n " if $n - $p >= 2;
$p = $n;
}
print "$list[$#list]\n";
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列やハッシュで中身が同じか...
-
perlで2つの配列を比較する方...
-
VBA for i=1 to lastrow
-
UWSCの終了の仕方
-
Escキーを押すと、中断する時と...
-
再帰関数のインライン展開
-
DOSコマンドのループ内のTIMEコ...
-
VBAのautofilter、criteriaの配...
-
画面を強制的に再描画させる方法
-
DoEventsが必要な理由について
-
GIFアニメをループさせたくない
-
フラグについて
-
perl 初等プログラミングについて
-
文字列の分割について
-
VBAでの一時停止と再開の方法
-
ハッシュのハッシュを実現したい。
-
二次元配列のインデックスについて
-
フローチャートを教えてください
-
全ての変数を初期化する方法は...
-
ハッシュ検索はなぜ速い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perlで2つの配列を比較する方...
-
perlでファイルの拡張子を除い...
-
python質問
-
ソート時同じ値がある場合、表...
-
データベースから取得したデー...
-
サブルーチンと繰り返し処理を...
-
DBIを使ってのデータの取り出し...
-
配列やハッシュで中身が同じか...
-
ファイルの最後の行から表示さ...
-
配列内定義サブルーチン呼び出し
-
grep関数を用いた複数行からの抽出
-
配列に格納した文字列の置換
-
二桁の数字からなる配列数10...
-
重複する領域を統合する方法
-
正規表現 perl 連続ヒットの...
-
ループ中でのmy宣言と処理速度
-
ハッシュ内の各値部分に配列を...
-
UWSCの終了の仕方
-
画面を強制的に再描画させる方法
-
VBのReturnの使い方
おすすめ情報