Perlは文字列変換などには最高の機能を発揮してくれますが、残念ながらウイズウイックではありません。
PCからコマンドを入れて起動させて実行させます、また、サーバー上に置き、ブラウザから起動させてやるCGIという方法もあります。
CGI化は次回にして、今回はパールスクリプトを掲載します。興味のある方はコピペしてお使いいただけます
#!usr/bin/perl ############################################ #how to use # shl2adif in_file_name out_file_name ############################################ # in_file:UTF8形式 改行はLFに予めしておく事 # Log.txtには変換中にエラーを発見した履歴を表示します。 # out_file : ADIF変換データが入ります # # shl2adif shldata.csv adiffile.adif # # use strict; use Jcode; #Jcodeコンバート用pmである use Time::Local; #<PRM:n>XXXXXX n=Len(x) #CALL BAND COMMENT FREQ MODE NAME QSL_RCVD QSL_SENT #QSL_VIA QSO_DATE QTH RST_RCVD RST_SENT #TIME_ON TIME_OFF #TX_PWR # my $LOG_path = 'cvlog.txt'; my $CSV_path = 'shlcsv.csv'; my $ADIF_path ='shladif.adif'; #print $ARGV[0]."\n"; #------------------------------------------ my $csv_hdr =<< "HEDDER"; programing by Yuzo Itoh Convert SmartHamLog CSV data to ADIF format <eoh> HEDDER #------------------------------------------ #LOGfile OPEN my ($argv_in, $argv_out, $argv_opt) = @ARGV; #LOG File my ($log_time, $log_date) = &subnet::get_time; print LOG "Convert DATE : " . $log_date . "\n"; if (!open(LOG, "> $LOG_path")){ print ("\n *NOT Created LOG file Aborted* \n"); exit; }
#CSV入力ファイルのオープン if ($argv_in){ $CSV_path = $argv_in; if (!open(CSV, "< $CSV_path")){ print "* 入力ファイル($CSV_path)が見つからない 終了します\n"; exit; } } else{ if (!open(CSV, "< $CSV_path")){ print "* 入力ファイル($CSV_path)が見つからない 終了します\n"; exit; } }
#ADIF出力ファイルのオープン if ($argv_out){ $ADIF_path = $argv_out; if (!open(ADIF, "> $ADIF_path")){ print "* ADIF出力ファイル($ADIF_path)がオープンできません 終了します\n"; exit; } } else{ if (!open(ADIF, "> $ADIF_path")){ print "* ADIF出力ファイル($ADIF_path)がオープンできません 終了します\n"; exit; } } #Start Massage print "\n*********************************** Start SHLCSV2ADIF\n"; print "input file name = ".$CSV_path."\n"; print "output file name = ".$ADIF_path."\n"; print "Logput file name = ".$LOG_path."\n"; #ADIF ヘッダー出力 print ADIF $csv_hdr; my $debug_ct=0; my $adif_str; my $ss_wk; my $err_ct; my @in_buff = <CSV>; foreach my $row_buff (@in_buff){ $debug_ct++; $row_buff =~ s/\r\n/\n/g; $row_buff =~ s/\r/\n/g; # $row_buff =~ s/\n//; # my $buff = Jcode->new( $row_buff, "sjis")->utf8; #sjisをutf8に変更する my $buff = Jcode->new( $row_buff)->utf8; #不明コードをutf8に変更する #入力ファイル改行コードが cr(Mac)では上手くいかない #LF UTF8 で処理 my $call = (split(/\,/,$buff))[0]; #CALLSIGN my $idou = (split(/\,/,$buff))[1]; my $name = (split(/\,/,$buff))[2]; my $date = (split(/\,/,$buff))[3]; my $time = (split(/\,/,$buff))[4]; my $rst_rcvd = (split(/\,/,$buff))[5]; my $rst_sent = (split(/\,/,$buff))[6]; my $freq = (split(/\,/,$buff))[7]; my $mode = (split(/\,/,$buff))[8]; my $qth = (split(/\,/,$buff))[9]; my $qsl_flag = (split(/\,/,$buff))[11]; my $jcc = (split(/\,/,$buff))[17]; my $qsl_sent = (split(/\,/,$buff))[13]; my $qsl_rcvd = (split(/\,/,$buff))[14]; my $pwr = (split(/\,/,$buff))[20]; my $trx_rig = (split(/\,/,$buff))[18]; my $ant = (split(/\,/,$buff))[19]; #エラーチェック if(! $call){&err_log("not_nall"); $err_ct++;} if(! $date){&err_log($call . " *not date*"); $err_ct++;} if(! $time){&err_log($call . " *not time*"); $err_ct++;} if(! $rst_rcvd){&err_log($call . " *not rst_rcvd*"); $err_ct++;} if(! $rst_sent){&err_log($call . " *not rst_sent*"); $err_ct++;}
#CALL、NAME,DATE,TIME
$ss_wk = &portable($idou); $adif_str = &mk_adif("CALL",$call.$ss_wk); $adif_str .= &mk_adif("NAME",$name); #時間 JSTをUTCに変換 my $utc_date = &JST2UTC($date." ".$time); my $ss_date = (split(" ",$utc_date))[0]; $ss_date =~ s/\///g; $adif_str .=&mk_adif("QSO_DATE", $ss_date); my $ss_time = (split(" ",$utc_date))[1]; $ss_time =~ s/\://g; $adif_str .= &mk_adif("TIME_ON", $ss_time); print ADIF $adif_str."\n"; #MODE, RST_RCVD, RST_SENT $adif_str = &mk_adif("MODE",$mode); $adif_str .= &mk_adif("RST_RCVD",$rst_rcvd); $adif_str .= &mk_adif("RST_SENT",$rst_sent); print ADIF $adif_str."\n"; #QTH, BAND, FREQ, TX_PWR $adif_str = &mk_adif("QTH",$qth); $adif_str .= &mk_adif("FREQ",$freq); $adif_str .= &mk_adif("TX_PWR",$pwr); print ADIF $adif_str."\n";
#QSL_RCVD, QSL_SENT, QSL_VIA, COMMENT $adif_str = &mk_adif("COMMENT",$jcc."\,".$trx_rig."\,".$ant); if ($qsl_flag eq "JARL"){ if($qsl_sent eq "1") {$adif_str .= &mk_adif("QSL_SENT","Y");} if($qsl_sent eq "0") {$adif_str .= &mk_adif("QSL_SENT","R");} } if ($qsl_flag eq "NOQSL") {$adif_str .= &mk_adif("QSL_SENT","I");} if ($qsl_flag eq "JARL"){ if($qsl_rcvd eq "1") {$adif_str .= &mk_adif("QSL_RCVD","Y");} if($qsl_rcvd eq "0") {$adif_str .= &mk_adif("QSL_RCVD","R");} } if ($qsl_flag eq "NOQSL") {$adif_str .= &mk_adif("QSL_RCVD","I");} $adif_str .= &mk_adif("VIA",&via($idou)); print ADIF $adif_str."\n"; #eor print ADIF "<eor>\n"."\n";
}
close(ADIF); close(CSV); close(LOG); #END Massage print $CSV_path."(input)------>".$debug_ct."\n"; print $ADIF_path."(output)<------".$debug_ct."\n"; print $LOG_path."(Errorlog)<------".$err_ct."\n"; print "\n*********************************** END of SHLCSV2ADIF\n\n"; exit; sub err_log{ my ($err_msg) = @_; print LOG $err_msg . "\n"; return; } sub via{ my ($ss_via) = @_; if ($ss_via =~ /^\@/){return $';} return ""; } sub portable{ my ($ss_p) = @_; if($ss_p =~ /^\d/){ return "\/".$&;} return ""; } sub mk_adif{ my($cmd,$str) = @_; my $ct = &zlength($str); if($ct eq "0"){return "";} return ("<".$cmd.":".$ct.">".$str); }
# JST2UTC(yyyy/mm/dd hh:mm:ss) sub JST2UTC{ my $jst_date = @_[0];
if($jst_date eq ""){return "";}
my $jst_year = (split("/",$jst_date))[0]; my $jst_month = (split("/",$jst_date))[1]; my $jst_day = (split("/",$jst_date))[2]; my $jikan = (split(" ",$jst_date))[1];
my $jst_hour = (split(":",$jikan))[0]; my $jst_min = (split(":",$jikan))[1]; my $jst_sec = (split(":",$jikan))[2]; if($jst_year < 1900) {return "";} if($jst_month < 1 || $jst_month > 12) {return "";} if($jst_day < 1 || $jst_day > 31) {return "";} if($jst_hour < 0 || $jst_hour > 24) {return "";} if($jst_min < 0 || $jst_min > 59) {return "";} if($jst_sec < 0 || $jst_sec > 59) {return "";}
my $byou = timelocal($jst_sec,$jst_min, $jst_hour, $jst_day, $jst_month-1, $jst_year-1900); $byou = $byou - 9 * 60 * 60; my($sec, $min,$hour,$mday,$mon,$year) = (localtime($byou))[0..5]; my($date) = sprintf("%04d/%02d/%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
return ($date); }
sub zlength { #--------------- #変換元はUTF8を想定している。 #SIFT_JISでの計算でなければ正確に出来ないよ #--------------- my $han_zen = $_[0]; my $sjis_str = Jcode->new( $han_zen, "utf8")->sjis; #utf8をsjisに変更する #------------ # my $sjis_str = $han_zen->sjis; #これでもOK # &Jcode::convert($han_zen,"sjis","utf8"); #utf8をsjisに変更する #------------
$_ = $sjis_str;
# 全角文字数を数え、全角文字を消去する my $lz = s/[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]//g; # 半角文字数を数える my $lh = length($_);
# 全角・半角の文字数を足して返す return $lz + $lh; }