見出し画像

テキスト形式の交信ログをADIFフォーマットにするPerlスクリプト

タブ区切りのQSOログテキストデータをADIFフォーマットに変換するPerlスクリプトを書きました。
と言うか、実際に書いたのはChatGPTさんですけどね。

1年くらい前にChatGPTさんに聞いたときは「ADIFって何?」という状態だったけど、最近(2024年7月)聞いたらちゃんとPerlスクリプトを書いてくれました。
勉強してくれてたんですね。ChatGPTさんありがとう。

それを使って作ったADIFログファイルをLoTWとeQSL.ccにアップしてみました。エラーなく受け付けてくれたみたいです。

私はログをスプレッドシートで管理していて、それをMySQLに流し込んで利用しています。(カードへの印刷とか交信中のログ検索とか)
そういう環境なのでログをテキストにするのは造作もないのですが、
これまではADIFへの変換のためだけにアマチュア無線専用のログソフトを使っていました。
なんでこんなめんどいことをしていたかと言うと、
当時から自前の変換スクリプトを書くという発想はあったのですが、
ADIFフォーマットの仕様を調べるのが面倒だったし、
その当時はChatGPTさんもADIFについては知らないようだったので手を出せないでいました。最近ChatGPTさんに聞いたらまともに答えてくれたので使わせていただくことにしました。

コードは以下です。標準入力からテキストを流し込んでつかいます。

#!/usr/bin/perl

# call,qso_data,time_on, mode, band, rst_sent, rst_rcvd,srx,stx

use strict;
use warnings;

# 標準出力にADIFヘッダーを書き込む
print "<ADIF_VER:5>3.0.3\n";
print "ADIF Export\n<EOH>\n";

# 標準入力から各行を処理する
while (my $line = <STDIN>) {
    chomp $line;
    # ヘッダー行をスキップ
    next if $. == 1;
    
    my ($call, $qso_date, $time_on, $mode, $band, $rst_sent, $rst_rcvd, $srx, $stx) = split('\t', $line);
    
    # ADIF形式で出力
    print "<CALL:" . length($call) . ">$call";
    print "<QSO_DATE:" . length($qso_date) . ">$qso_date";
    print "<TIME_ON:" . length($time_on) . ">$time_on";
    print "<MODE:" . length($mode) . ">$mode";
    print "<BAND:" . length($band) . ">$band";
    print "<RST_SENT:" . length($rst_sent) . ">$rst_sent";
    print "<RST_RCVD:" . length($rst_rcvd) . ">$rst_rcvd";
    print "<SRX:" . length($srx) . ">$srx";
    print "<STX:" . length($stx) . ">$stx";
    print "<EOR>\n";
}

この記事が気に入ったらサポートをしてみませんか?