perlを使用して、test5_2.csvのA列とtest5.csvのA列が一致した中から、test5_2.csvにあるD列からE列の範囲(D以上E以下もしくはE以上D以下)に、test5.csvのD列もしくはE列が該当するデータをtest5.csvから抽出したいのですが、思ったように結果が出せない状況です。良い方法をご教示できないでしょうか。
test5_2.csv
A,B,C,D,E
1,総武線,上り,5,0
2,総武線,下り,0,14.24
12,京葉線,下り,0.58,0
15,京葉線,上り,0,0.43
3,新京成線,上り,4.38,0
4,新京成線,下り,4.27,4.5
5,京成線,上り,8,0
6,京成線,下り,0,13.97
5,京成線,上り,0.38,0.97
test5.csv
A,B,C,D,E
1,総武線,上り ,0,3,
1,総武線,上り ,4,25,
1,総武線,上り ,52,57,
1,総武線,上り ,65,78,
2,総武線,下り ,0,119,
12,京葉線,下り ,0,5,
15,京葉線,上り ,4,0,
3,新京成線,上り ,0,43,
4,新京成線,下り ,42,0,
5,京成線,上り ,100,137,
6,京成線,下り ,78,78,
6,京成線,下り ,78,78,
use strict; use warnings; use Text::ParseWords; use encoding 'euc-jp'; use open IN => ":encoding(cp932)"; open (FILE, 'test5_2.csv') or die "$!"; my @train; #my @match; my @D2; my @E2; my @A2; while(my $line = <FILE>){ my($A2, $B2, $C2, $D2, $E2) =split(',', $line); $B2 =~ s/\s+//; $C2 =~ s/\s+//; push(@D2,$D2); push(@E2,$E2); push(@A2,$A2); } close(FILE); open (FILE, 'test5.csv') or die "$!"; while(my $line = <FILE>){ my ($A, $B, $C, $D, $E) =split(',', $line); my $DD = $D/10; my $EE = $E/10; $B =~ s/\s+$//; $C =~ s/\s+//; foreach my $a2(@A2){ if($a2 eq $A){ foreach my $d2(@D2){ foreach my $e2(@E2){ if($d2<=$DD && $DD<=$e2){ push(@train,$A.','.$B.','.$C.','.$DD.','.$EE); } elsif($e2<=$DD && $DD<=$d2){ push(@train,$A.','.$B.','.$C.','.$DD.','.$EE); } elsif($d2<=$EE && $EE<=$e2){ push(@train,$A.','.$B.','.$C.','.$DD.','.$EE); } elsif($e2<=$EE && $EE<=$d2){ push(@train,$A.','.$B.','.$C.','.$DD.','.$EE); } } } } } } close(FILE); ##################################### # @trainの中で重複している項目を削除 # ####################################3 my %count; @train = grep(!$count{$_}++, @train); @train = sort @train; print join("\n", @train)."\n";
現状では以下のような結果になります。
1,総武線,上り,0,0.3
1,総武線,上り,0.4,2.5
1,総武線,上り,5.2,5.7 ×
1,総武線,上り,6.5,7.8 ×
12,京葉線,下り,0,0.5
15,京葉線,上り,0.4,0
2,総武線,下り,0,11.9
3,新京成線,上り,0,4.3
4,新京成線,下り,4.2,0 ×
5,京成線,上り,10,13.7 ×
6,京成線,下り,7.8,7.8
本来は上記の×の行が該当せずに以下のような結果にしたいと考えています。
1,総武線,上り,0,0.3
1,総武線,上り,0.4,2.5
12,京葉線,下り,0,0.5
15,京葉線,上り,0.4,0
2,総武線,下り,0,11.9
3,新京成線,上り,0,4.3
6,京成線,下り,7.8,7.8
説明不足の点も多々あるかと思いますが、何卒よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー