key.csvというファイルに以下のようなデータが入っています。
U1362-2005-05-16 12:00
U1363-2005-05-16 12:00
U13255-2005-05-16 12:10
key.csvのデータ数は毎回異なります。
この各行の文字列を検索キーとして
data.csvに含まれるデータとのパターンマッチングを行いたいのです。
data.csvには
U1306-2005-05-16 12:00-xxx,1
U1362-2005-05-16 12:00-xxx,1
U1363-2005-05-16 12:00-xys,2
U1365-2005-05-16 12:00-xys,3
U13255-2005-05-16 12:10-yyy,1
のようにデータが入っています。
この例ではパターンマッチによって
U1362-2005-05-16 12:00-xxx,1
U1363-2005-05-16 12:00-xys,2
U13255-2005-05-16 12:10-yyy,1
という結果を得たいです。
key.csvが一定のデータではないので
=~//; の中に特定の数値を入れることも出来ないので、$key[0]などの変数を入れたいのですがうまくいきません。
どうしたらよいでしょうか?
No.6ベストアンサー
- 回答日時:
key.csv から検索したいデータを読み込むときに改行が付いているのでそれを chomp で取り去る必要があります:
open(KEY, "key.csv");
chomp(@keys = <KEY>);
close(KEY);
open(VAL, "data.csv");
while ($data = <VAL>) {
chomp $data;
for $key (@keys) {
print "$data\n" and next if $data =~ /$key/;
}
}
close(VAL);
出来ました!!
ありがとうございました。
協力してくださった皆様ありがとうごさいました。
perl初めて3週間ぐらいでまだわからないことも多いです。
機会があればまたよろしくお願いします。
No.4
- 回答日時:
なぜ正規表現で動かないのか良くわかりませんが、
ダメならindex関数を使うようにしたらどうでしょう?
open(IN,"key.csv");
@keydata=<IN>;
close IN;
open(IN2,"data.csv");
while($data=<IN2>){
chomp();
grep(index($data,$_)>=0,@keydata) && print "$data\n";
}
close(IN2);
ありがとうございます。勉強になります!
しかし
U1362-2005-05-16 12:00-xxx,1
U1363-2005-05-16 12:00-xys,2
U13255-2005-05-16 12:10-yyy,1
という結果が得られません。
正常に動いて上の結果が出たという方いましたら、書き込みお願いします。
No.3
- 回答日時:
$dataと@dataが同一スコープ内で二重定義(スカラ型と配列型)になっています。
処理の中で「@data=split(/,/);」の行は不要かと思います。
あとはANo2さんの通りに正規表現の「or」を「|」にすれば何らかの結果はでるかと思います。
ありがとうごさいます。
二重定義(スカラ型と配列型)ですか知りませんでしたw
正規表現の「or」を「|」に修正したのですが、
U1362-2005-05-16 12:00
U1363-2005-05-16 12:00
U13255-2005-05-16 12:10
が出力されるのみで、欲しい結果は出力されません。
No.2
- 回答日時:
if($data=~/$keydata[0] or $keydata[1] or$keydata[3] /){
を
if($data=~/$keydata[0]|$keydata[1]|$keydata[3]/){
に修正すれば何か表示されると思います
この回答への補足
ありがとうございます。
修正しましたが何も出力されませんでした。
if($data=~/$keydata[0]|$keydata[1]|$keydata[3]/){ を
if($data=~/U1362-2005-05-16 12:00|U1363-2005-05-16 12:00|U13255-2005-05-16 12:10/){ に変えると思い通りの結果が得られるのですが、
key.csvのデータは一定ではないので、やはり変数を使用したいです。
また if($data=~/$keydata[0]/){ のように入力しても結果は得られません。
エラーもなく、空白の一行が出力されるだけです。
$keydata[3]ではなく$keydata[2]の間違えでした。
No.1
- 回答日時:
// の中に変数を使うことについては問題ないので、単純なロジックのエラーだと思います。
どう巧くいかないのか、もしくは何のエラーが出るのかを補足していただければ、また違った回答ができるかもしれません。
この回答への補足
open(IN,"key.csv");
@keydata=<IN>;
print "$keydata[0]$keydata[1]$keydata[3]\n"; #検索項目確認
open(IN2,"data.csv");
while($data=<IN2>){
chomp();
@data=split(/,/);
if($data=~/$keydata[0] or $keydata[1] or$keydata[3] /){
print "$data\n";
}
}
初心者なので間違いだらけかもしれませんが
このようにすると
U1362-2005-05-16 12:00
U1363-2005-05-16 12:00
U13255-2005-05-16 12:10
だけ出力されて 肝心のパターンマッチの結果が何も出力されません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- Visual Basic(VBA) エクセルVBA 3 2022/06/23 20:00
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- 物理学 統計力学における平衡状態の定義について 4 2022/12/27 01:47
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- 数学 線形代数の正規直行系についての問題がわからないです。 1 2022/07/16 11:20
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSVデータの編集の際の重複チェ...
-
Perlで特定行から特定行までを...
-
perlでcsvファイルを読む(ダブ...
-
Perlでの重複要素カウントにつ...
-
awkスクリプトでダブルクォーテ...
-
window.open でのファイル指定方法
-
ListBoxのデータを高速でファイ...
-
C言語で特定の行を抽出する方法...
-
ReadLineでの読み出し行を指定する
-
VBAでCSVファイルを途中行まで...
-
パスから最後のディレクトリだ...
-
ヒアドキュメントの書き方
-
Edge スクレイピング
-
ExcelをCSV書き出す場合のシー...
-
close()で例外が投げられる理由
-
配列の中に重複文字列があるか...
-
オープンしたファイルで行の連結
-
utf-8のCSVをshift_jisに変換し...
-
python renameについて
-
openした後、closeしないでプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
perlでcsvファイルを読む(ダブ...
-
BBCode削除&改行をサニタイジ...
-
Perlで空白行を削除
-
Perlの初心者です。2重ループ...
-
MATLAB std::exceptionエラー
-
ファイルの3行目までを出力したい
-
perlでファイルの比較
-
pythonでの実績データの処理プ...
-
cgiのログの書き方
-
先頭の単語が一致した時のデー...
-
書き込み時に勝手にクリアさせ...
-
エラーチェック、ファイルに特...
-
Argument "\\\\n" isn't numeri...
-
CSVファイルのデータの行数を取...
-
perl:パターンマッチを使ったif...
-
Pythonでegrep機能をつかいたい
-
batファイルでrenameができませ...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
おすすめ情報