前提・実現したいこと
Perlで2つのcsvの情報から共通する部分を探索し、一致した行はそれを組み合わせるスクリプトを作っています。
具体的にはa.csv(図1)にある情報のうち、b.csv(図2)にあるものとcodeが共通するものがあれば、a.csv内のE_commentとJ_commentの内容をb.csvの右の2列に追加したものを出力ファイルc.csvとして出力するといった内容です。
発生している問題・エラーメッセージ
出力ファイルc.csvは理想的には図3のようになってほしいのですが、ソースコードのファイル出力に該当するprint OUTを少し変えると図4のように勝手に改行が入ってしまいます。
該当のソースコード
【問題のあるprint OUT文】
print OUT0 "$m_line[0],$m_line[1],$m_line[2],$m_line[3],$m_line[4],$m_line[5],$e_comment,$j_comment\n";
【正しく結果を表示するprint OUT文】
print OUT0 "$m_line[0],$m_line[1],$m_line[2],$m_line[3],$m_line[4],,$e_comment,$j_comment\n";
Perl
1#!/usr/bin/perl 2use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat); 3 4my $in0 = ""; 5my $in1 = ""; 6my $out = ""; 7my $h = ""; 8 9use strict; 10use warnings; 11use utf8; 12binmode STDIN, ':encoding(cp932)'; 13binmode STDOUT, ':encoding(cp932)'; 14binmode STDERR, ':encoding(cp932)'; 15 16#ファイル読み込み 17GetOptions( 18 'a=s' => $in0, 19 'b=s' => $in1, 20 'o=s' => $out, 21 'h' => $h 22); 23 24if($h){ 25die "Usage : hoge.pl -a input1 -b input2 -o outputfile\n" . 26"\n" . 27" -a : input file0\n" . 28" -b : input file1\n" . 29" -o : output file \n" . 30" -h : help manual \n" . 31"\n" 32} 33 34if($in0 ne "" && $in1 ne ""){ 35 36 #comment list 37 chomp($in0); 38 open(IN0, "$in0") or die "Cannnot open $in0\n"; 39 40 #error log 41 chomp($in1); 42 open(IN1, "$in1") or die "Cannnot open $in1\n"; 43}else{ 44die "Error : 2 input file is not specified.\n" . 45"Usage : hoge.pl -a input1 -b input2 -o output\n" . 46"\n" . 47" -a : input file0\n" . 48" -b : input file1\n" . 49" -o : output file \n" . 50" -h : help manual \n" . 51"\n" 52} 53 54if($out ne ""){ 55 chomp($out); 56 open(OUT0, ">$out") or die "Cannot open $out"; 57}else{ 58die "Error : output file is not specified.\n" . 59"Usage : hoge.pl -a input1 -b input2 -o output\n" . 60"\n" . 61" -a : input file0\n" . 62" -b : input file1\n" . 63" -o : output file \n" . 64" -h : help manual \n" . 65"\n" 66} 67 68 69&summary(); #共通codeの探索と出力を両方行うサブルーチン 70 71sub summary{ 72 my @c_line = (); 73 my %e_hash; 74 my %j_hash; 75 76 #a.csvの読み込み 77 seek(IN0, 0, 0); 78 while(<IN0>){ 79 chomp; 80 @c_line = split(/,/, "$_"); 81 82 $e_hash{$c_line[0]} = $c_line[1]; 83 $j_hash{$c_line[0]} = $c_line[2]; 84 } 85 86 delete($e_hash{'code'}); 87 delete($j_hash{'code'}); 88 89 my @m_line = (); 90 my $j_comment = ""; 91 my $e_comment = ""; 92 my $count = 0; 93 94 #b.csvの読み込み 95 seek(IN1, 0, 0); 96 while(<IN1>){ 97 chomp; 98 @m_line = split(/,/, "$_"); 99 100 foreach my $e_key ( keys %e_hash ){ 101 if($e_key eq $m_line[0]){ 102 $e_comment = $e_hash{$e_key}; 103 last; 104 }else{ 105 $e_comment = ""; 106 } 107 } 108 foreach my $j_key ( keys %j_hash ){ 109 if($j_key eq $m_line[0]){ 110 $j_comment = $j_hash{$j_key}; 111 last; 112 }else{ 113 $j_comment = ""; 114 } 115 } 116 if($count == 0){ 117 print OUT0 "code,mode,message,judge,member,comment,E_comment,J_comment\n"; 118 $count = 1; 119 }else{ 120#問題のある結果を出力するprint OUT(図4) 121 print OUT0 "$m_line[0],$m_line[1],$m_line[2],$m_line[3],$m_line[4],$m_line[5],$e_comment,$j_comment\n"; 122 123#正しい結果を出力するprint OUT(図3) 124# print OUT0 "$m_line[0],$m_line[1],$m_line[2],$m_line[3],$m_line[4],,$e_comment,$j_comment\n"; 125 } 126 } 127} 128close(IN0); 129close(IN1); 130close(OUT0);
実行文
% perl hoge.pl -a a.csv -b b.csv -o c.csv
補足情報(FW/ツールのバージョンなど)
UNIX環境
回答1件
あなたの回答
tips
プレビュー