ソフト

スマログCSVデータをADIFに変換(perlスクリプトで実装)

Perlは文字列変換などには最高の機能を発揮してくれますが、残念ながらウイズウイックではありません。

PCからコマンドを入れて起動させて実行させます、また、サーバー上に置き、ブラウザから起動させてやるCGIという方法もあります。

CGI化は次回にして、今回はパールスクリプトを掲載します。興味のある方はコピペしてお使いいただけます

shl2adif in_file_name out_file_name

#!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;
}

トップ   編集 凍結解除 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-10-31 (火) 09:13:18