- 追加された行はこの色です。
- 削除された行はこの色です。
- Shl2Adif へ行く。
#freeze
[[ソフト]]
#contents
*スマログCSVデータをADIFに変換(perlスクリプトで実装) [#wbed018d]
Perlは文字列変換などには最高の機能を発揮してくれますが、残念ながらウイズウイックではありません。
PCからコマンドを入れて起動させて実行させます、また、サーバー上に置き、ブラウザから起動させてやるCGIという方法もあります。
CGI化は次回にして、今回はパールスクリプトを掲載します。興味のある方はコピペしてお使いいただけます
** shl2adif in_file_name out_file_name [#o6ed080b]
#!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;
}