こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

perlでcsvファイルから複数行を抽出したい

プログラミング初心者です。
お知恵をお貸しください。

perlでcsvファイルから任意の複数行を、コマンドライン引数を使って抜き出したいです。
1行だけだとうまくいきますが、以下ではすべてのcsvデータが出力されてしまいます。


----------------------getcsv.pl ここから----------------------
#!/usr/bin/perl --

use strict;
use warnings;

open(IN, "<adata.csv");
open (OUT, ">$bdata.csv");
while(<IN>){
if($. == $ARGV[0] || $ARGV[1] || $ARGV[2] || $ARGV[3]) {
print OUT $_;
}
}
close(IN);
close (OUT);
----------------------getcsv.pl ここまで----------------------

----------------------コマンド ここから----------------------
perl getcsv.pl 1 3 8 10
----------------------コマンド ここまで----------------------

よろしくお願いします。

投稿日時 - 2019-09-17 02:08:43

QNo.9657641

困ってます

質問者が選んだベストアンサー

>元のcsvから、引数の数字(上記の場合だと、1行目、 3行目、 8行目、 10行目)のデータだけを別のcsvで作成できないかと思っています。

「現在の行番号が、$ARGV[0] または $ARGV[1] または $ARGV[2] または $ARGV[3]のいづれかと等しい」というつもりで

>$. == $ARGV[0] || $ARGV[1] || $ARGV[2] || $ARGV[3]

と書かれているのでしょうが、これは
「現在の行番号が、$ARGV[0]と等しい」または「$ARGV[1]が0以外」または「$ARGV[2]が0以外」または「$ARGV[3]が0以外」
という意味です。

書くのなら
「現在の行番号が、$ARGV[0]と等しい」または「現在の行番号が、$ARGV[1]と等しい」または「現在の行番号が、$ARGV[2]と等しい」または「現在の行番号が、$ARGV[3]と等しい」
という風に書いてください。

投稿日時 - 2019-09-17 03:12:56

補足

----------------------getcsv.pl ここから----------------------
#!/usr/bin/perl --

use strict;
use warnings;

open(IN, "<adata.csv");
open (OUT, ">$bdata.csv");
while(<IN>){
if($. == $ARGV[0] || $. == $ARGV[1] || $. == $ARGV[2] || $. == $ARGV[3]) {
print OUT $_;
}
}
close(IN);
close (OUT);
----------------------getcsv.pl ここまで----------------------

上記で思っていた通りの結果を取得することができました。
ありがとうございました。

投稿日時 - 2019-09-17 04:30:54

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

>if($. == $ARGV[0] || $ARGV[1] || $ARGV[2] || $ARGV[3]) {

どういう動作を期待して、これを書いていますか。

投稿日時 - 2019-09-17 02:23:10

補足

元のcsvから、引数の数字(上記の場合だと、1行目、 3行目、 8行目、 10行目)のデータだけを別のcsvで作成できないかと思っています。
よろしくお願いいたします。

投稿日時 - 2019-09-17 02:41:04

あなたにオススメの質問