はじめまして、皆様のお知恵を拝借したく投稿しました。
よろしくお願いします。
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルで、ファイルの分割 と ファイルの集約 1 2022/08/28 08:58
- 家政学 編入試験について 1 2022/08/22 03:00
- C言語・C++・C# あまりわかりません。 複素数$c$を具体的に定めた複素写像写像$f_c(z)$に対して、原点を含む領 4 2022/10/25 09:17
- ホームページ作成・プログラミング CGIが実行可能なHP領域又はレンタルサーバーでおすすめの所を教えてください 現在ホームページ領域の 1 2023/01/01 11:47
- 物理学 示すように,真空中の直交座標系を考える。y平面に平行な つ領域Iと領域Iがあり,軸上の領域Iと領域I 1 2023/06/25 14:46
- 世界情勢 韓国の尹政府から眺めた日韓関係と成り立たせの可能性は。? 4 2022/05/25 08:06
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- その他(ブラウザ) bingチャットの内容(縦長)をスクリーンショットで保存する方法 3 2023/02/28 02:13
- ドライブ・ストレージ Win10を再インストールしたら、HDDの一部に未割り当て領域ができ何の操作もできません。 4 2023/05/19 05:31
- Perl Perlでファイルの末尾から指定文字列を検索してファイルに吐き出したい 4 2022/04/04 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
組み合わせを作るアルゴリズム
-
データベースから取得したデー...
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
VBのReturnの使い方
-
DoEventsが必要な理由について
-
クラスに配列を渡す方法
-
pythonでファイルのコメント行...
-
DOSコマンドのループ内のTIMEコ...
-
For文を使った九九表の作成
-
VBAで3秒だけ時間を止めたい
-
英語でのシャープとコメの呼び...
-
vbscriptでIE自動入力(途中で...
-
ループ内での条件処理
-
CSVファイルの特定の行だけを読...
-
GIFアニメをループさせたくない
-
VBA横データを縦にしたいです
-
vb.netからエクセル関数書き込み
-
VBScript 配列
-
エクセル関数で1〜12の数字がル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データベースから取得したデー...
-
perlで2つの配列を比較する方...
-
DBIを使ってのデータの取り出し...
-
python質問
-
perlでファイルの拡張子を除い...
-
アルファベットn文字の組み合わ...
-
grep関数を用いた複数行からの抽出
-
乱数と順列と組み合わせ
-
半角文字の縦書き表示
-
配列やハッシュで中身が同じか...
-
ループ中でのmy宣言と処理速度
-
桁数指定と四捨五入
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
VBのReturnの使い方
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
おすすめ情報