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.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さんのおっしゃる通りこれらの複合ができてないのだと思います。
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";
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBA オートフィルタでの絞り込みと並び替えについて 1 2023/07/08 13:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- その他(プログラミング・Web制作) python 3.10で 同じlistに同じ構文で同じデータ代入した結果が異なる現象発生 7 2022/06/18 11:08
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlをバージョンアップしたら...
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlの構文でカンマの意味が分...
-
英数文字列のうちの数値を4桁に...
-
テキストファイルで提出とは?
-
Perlのエラーについてご教授く...
-
AI sisterとは、偽物の人ですか?
-
perlのrequireの動き方について...
-
perlのプログラミング 部分入れ...
-
Strawberry Perl for Windows ...
-
arduino の割り込み処理について
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
bashスクリプト
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の中に重複文字列があるか...
-
C言語のバイナリモードでのfsca...
-
データの日付でソートをしたい
-
perlで複数行のデータを自由に...
-
perl-cgi 文字の長さでソートし...
-
Visual C++を用いたシリアル通信
-
バッチファイルの作り方(CSV→...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
-
DOSコマンドで、標準出力を出力...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
close()で例外が投げられる理由
-
batファイルでrenameができませ...
-
VBAでCSVファイルを途中行まで...
-
window.open でのファイル指定方法
-
VBAで巨大なファイルの途中から...
-
Perlで特定行から特定行までを...
-
ReadLineでの読み出し行を指定する
-
エクセルVBAで素数だけを出力す...
おすすめ情報