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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS