
perlでデータを並び替えて整理したいです。
【元データ】
A a b
A c d
A e f
A g h
B i j
B k l
B m n
C o p
C q r
C s t
C u v
・
・
・
上記のデータを下記のように並び替えしたいのですが上手くできずに困っています。
どのような記述をすれば良いのでしょうか。間の空白はタブ区切りです。
【目標】
A a b c d e f g h
B i j k l m n
C o p q r s t u v
D
・
現在、元データから
A
B
C
D
・
・
というデータを作り、元データと比較していますが上手くいきません。
for($i=0; $i<@key; $i++){
print OUT "$key[$i]";
for($j=0; $j<@data; $j++){
if($key[$i] =~ /$data[$j]/){ #部分一致
print OUT "$'";
}
}
print OUT "\n";
}
部分一致の行を正規表現を用いて上手く処理したいのですがやり方がわからず躓いています。
宜しくお願いします。
No.2ベストアンサー
- 回答日時:
いまいち正確な仕様がわからないので・・・
一番最初の文字をキーに並び替えを行うということで書いてみたのですが
大きな流れは、こんな感じ。
ファイルに書いてあるデータを読み込む。
1行ずつ受け取りタブでsplitする。
最初の文字をキーに配列に残りデータをpushする
出力。
おしまい。
#!/usr/bin/perl
use strict;
use warnings;
#データの記載されたファイルを開く
open my $fh, "<", "hoge.txt" or die $!;
my (%hash, @data);
while (my $line = <$fh>) {
chomp($line); #行末の改行コードを削除する
#1.tabで分割
@data = split(/\t/, $line);
#2.ハッシュに、最初の文字をキーに。値を配列のリファレンスとみなし
# 2番目の要素から最後の要素を配列のスライスとしてpushする
push @{$hash{$data[0]}}, @data[1, -1];
}
close $fh or die $!;
#3.出力
for my $key (sort keys %hash){
#最初の文字(大文字のアルファベット)と残りを配列として扱い tabでjoinして出力
print join("\t", ($key, @{$hash{$key}})), "\n";
}
No.4
- 回答日時:
#2 を勝手に改造する試み:
まず @data は while の中でしか使っていないので my の位置を移動する. ついでに分割するときに
my ($key, @data) = split /\t/, $line;
とすればそのあとが
push @{$hash{$key}}, @data;
と短くなる.
No.1
- 回答日時:
「うまくいかない」とはどのような状態でしょう?
その分析から始めるのがプログラミングのコツです。
if($key[$i] =~ /$data[$j]/){
これだと、
・行の途中に $data[$j] がある場合でもマッチする。
・ $key[$i]が検索対象。 $data[$j] を探す
・$data[$j]内に正規表現のメタ文字等が入っていると、文字検索ではなく正規表現検索になる
という問題があります。
うまくいかないのは、これらの複合では?
この回答への補足
回答ありがとうございます。
言葉足らずで申し訳ありません。
@key=A
B
C
・
・
@data=元データ
と設定し、
OUTに出力する。
1.@keyのAをOUTに出力
2.for文を用いて@keyのAと、@dataのAを比較。
@keyのAと@dataのAが一致した時、@dataのAの行をOUTに抜き出す(Aの右側の部分のみ)。この繰り返しで@dataのAの行の右側部分を
OUTに全て出力する。
3.改行する
4.1と同様に@keyのBをOUTに出力 以下同様の操作
という操作を行いたいと考えています。
$key[$i]が $data[$j]の頭の部分(例:A)と一致する場合に$data[$j]の後ろの部分(例:a b)を抜き出したいのですが、この場合にメタ文字をどのようにif文に組み込めば良いかというところがわかりません。
・行の途中に $data[$j] がある場合でもマッチする。
→@keyのA,B,C..は@dataの頭の部分にしかないので
行の途中で一致するということは無いと思います。
・$data[$j]内に正規表現のメタ文字等が入っていると、文字検索ではなく正規表現検索になる
→a b等の間にタブが入っているので正規表現検索になっているということでしょうか?
kmeeさんのおっしゃる通りこれらの複合ができてないのだと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
アルファベットに付いて質問し...
-
Perlのエラーについてご教授く...
-
perlをバージョンアップしたら...
-
perlについての質問
-
INDIRECT 横に再度抽出したい
-
openした後、closeしないでプロ...
-
検索ボックスから製品名を検索...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pandasでまとめてインデックス...
-
<IN>; を単独で使う
-
サブルーチンの結果
-
perlで読み込んだURLを配列に入...
-
Perlのサンプルを見ていると
-
データの日付でソートをしたい
-
Perl ファイルを読込んで日付の...
-
perlの無名配列の使い方を教え...
-
Pythonの再帰関数の動作の流れ...
-
行・列の整理! perl
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
awkスクリプトでダブルクォーテ...
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
Windowsで複数のファイルを同じ...
-
where can I buy snowbord in t...
-
ReadLineでの読み出し行を指定する
-
バッチファイルの作り方(CSV→...
-
C言語で特定の行を抽出する方法...
おすすめ情報