JH3DRN 趣味の徒然

主にアマチュア無線、電子工作について書いてます.

RUMlogNGのADIFファイルをQSLラベル印刷用CSVに変換する(Markdownで書いてみました)

 RUMlogNG と MacLoggerDX の両方のソフトを所有していてなぜRUMlogNG を使っているかと言うと、QSLラベルに印刷するリグ、アンテナがバンド毎に設定出来る事にある。 各バンドのリグ、アンテナを登録しておけばQSL発行時に自動的に登録内容を印刷(出力)してくれるのでとても便利。折角お金出して MacLogger買ったけど使っていないのはこれが理由。 そんなわけで RUMlogNGには満足していて重宝しているが、不満点が幾つかある。

  1. QSLラベルを印刷するのに対応しているラベルに国産が含まれていない(米国製のラベルは入手困難&高価である)
  2. QSLラベルをソートして印刷したいが思うように出来ない(ラベルの印刷単位によってソートを変えたりしたい)

1に付いては「メールくれたら対応するよ」とは言ってくれているが、手持ちによってラベルの種類を変える事もあるので、これはパス。 2に付いても同様でフレキシブルに作業したいと思っている。で、ADIFからCSVへの変換プログラムは幾つか出回っているが、変換の手間(前処理、後処理)を考えるとこれもしっくりこないので、思い切って作る事にした。 作ると言ってもプログラムを作る訳では無く(まあawkもプログラムだけれど)awksed を使って作って見た。どちらも mac であれば標準装備なので問題は無い。結果から書いて、後で解説する事にする。まず、元のADIFファイルの内容だが、

------ オリジナルのADIFファイル --------

ADIF Export from RumLogNG by DL2RUM
For further info visit: http://www.dl2rum.de

<ADIF_VER:5>3.1.3
<CREATED_TIMESTAMP:15>20220915 082455
<PROGRAMID:8>RUMlogNG
<PROGRAMVERSION:5>5.9.2
<EOH>


<call:5>ZD7MY  <qso_date:8>20211107 <time_on:6>073744 <band:3>20m  <freq:9>14.075800  <mode:3>FT8  <rst_sent:3>-17
  <qsl_rcvd:1>N <qslmsg:24>IC741 4ele Yagi 20mh  <notes:24>IC741 4ele Yagi 20mh   <eor>
<call:5>CT3KN  <qso_date:8>20211107 <time_on:6>080844 <band:3>20m  <freq:9>14.082700  <mode:4>MFSK  <submode:3>FT4
  <rst_sent:3>-09  <qsl_rcvd:1>N <qslmsg:24>IC741 4ele Yagi 20mh  <notes:24>IC741 4ele Yagi 20mh   <eor>
<call:5>F1TZE  <qso_date:8>20211107 <time_on:6>081214 <band:3>20m  <freq:9>14.082700  <mode:4>MFSK  <submode:3>FT4
  <rst_sent:3>-12  <qsl_rcvd:1>N <qslmsg:24>IC741 4ele Yagi 20mh  <notes:24>IC741 4ele Yagi 20mh   <eor>
<call:6>IS0KNG  <qso_date:8>20211107 <time_on:6>081422 <band:3>20m  <freq:9>14.082700  <mode:4>MFSK  <submode:3>FT4
  <rst_sent:3>-03  <qsl_rcvd:1>N <qslmsg:24>IC741 4ele Yagi 20mh  <notes:24>IC741 4ele Yagi 20mh   <eor>
-------------------------------------------------------------------------------------~~~

最初にヘッダがあって、その後にQSOデータがある。課題としては

  1. コールサイン不定長(後ろにスペースが入っている)
  2. FT4の場合、mode には”MFSK”と入っていて、submode に"FT4"と入っている
  3. 日時、時刻がベタ表示(20220909 1020 みたいに)

この当たりを考慮してawkのプログラムを作った。上記のADIFファイルの変換結果が

-------- 変換後のcsvファイル --------------------------------------------

ZD7MY,2021/11/07,07:37,14.0758,FT8 ,-17,IC741 4ele Yagi 20mh  
CT3KN,2021/11/07,08:08,14.0827,FT4 ,-09,IC741 4ele Yagi 20mh  
F1TZE,2021/11/07,08:12,14.0827,FT4 ,-12,IC741 4ele Yagi 20mh  
IS0KNG,2021/11/07,08:14,14.0827,FT4 ,-03,IC741 4ele Yagi 20mh  
------------------------------------------------------------------------

ご覧の様に、不定長のコールサインもスペースが取られていて日付、時刻もフォーマットされている。MFSK は FT4 に変換されており、リグ、アンテナ欄のスペースも削除されていない。これなら印刷用CSVとして使えると思う。で、awkのコマンドファイルと実際に入力するコマンドを下記する

-------- awk コマンドファイル: conv.awk の内容---------

-------- awk コマンドファイル: conv.awk の内容---------

# RUMlogNGのADIFファイルをCSV形式に変換する
#                     2022/09/15 JH3DRN
BEGIN {
   FS = "<"    #入力セパレータを < とする
   OFS= ","    #出力セパレータを , とする
   }
{
for(i=0;i<1;i++)
   { 
   if(NR>10)     # 10行目から処理する ヘッダは読み飛ばす
     {
     (/>/gsub(/ /, "", $2)); print (substr($2,8,index($2,">")+5)),
        # callの前のヘッダを削除 と callの後のスペース削除
     substr($3,12,4) "/" substr($3,16,2) "/" substr($3,18,2),        # 日付Form yyyy/mm/dd
     substr($4,12,2) ":" substr($4,14,2),   # 時刻Form hh:mm
     substr($6,8,7),                                        # 周波数切出
     substr($7,8,4),                                        # Mode 切出
     substr($(NF-4),12,3),                            # RST 切出
     substr($(NF-2),11,26)                            # リグアンテナ切出
        }
    }
}

END {
}
--------------------------------------------------------------------------------

コマンドラインからの入力>

$awk -f conv.awk 0915.adi | sort | sed -e "s/MFSK/FT4 /g" -e "s/>//g" > qsl.csv 

説明:adiファイル "0915.adi" を "conv.awk" で変換し、並び順をソートして sedに渡し、sed で"MFSK" を ”FT4"に変換してファイル"qsl.csv"に格納する。 簡単そうに見えるが作るのに丸1日掛かった!! ご参考になれば幸い。 実際の印刷は次回とします。 追記:コールサインが10文字以上の場合に正確に変換出来ないケースがあったのでconv.awkコマンドラインを修正しました。これで、昨年末からのQSO約600局のQSLラベルが正確に印刷出来ました。(修正はアンダーーラインの部分)