【景品表示法に基づく表記】

本サイトのコンテンツには、商品プロモーションが含まれている場合があります。

DIARY PR

[DIARY] 毎月の集計作業を自動化

キーボード
記事内に商品プロモーションを含む場合があります

Loading

公開日 2025年9月5日  最終更新日 2025年9月5日 by JE2UFF_Toshi

 

おはようございます。今朝は台風15号の影響で、大雨の朝になっております。風は殆ど無いですが、大雨の中でも時折タライをひっくり返した用に集中的に豪雨が来ます。

 

現在四国沖にいるようですが、これからこちらに向かって来る進路になっておりますね。今回は雨台風と言う事なので大雨が心配です。予報では大雨のピークは午前中とのことですが、進路図を見る限り今日1日はずっと大雨の感じですね。

台風15号

無線の方もコンディションが上がって来ておりパイルが激しくなってきております。パイルがなかなか抜けないので、日頃課題と思っていた事に手を付けました。

 

毎月QSO実績を集計しているのですが、これが以外と面倒くさい。手順としては、

  1. 対象月のQSOをLogからExportする
  2. バンド事に並び替えを実施
  3. バンド毎のQSO数の集計を行う
  4. 集計数字をExcelに入力し円グラフを作成する
  5. 作成された円グラフを定型の形に修正する
  6. 出来上がったグラフを画像化する

作業としてはたいした内容ではないのですが、集計したり入力したりと数が少ない場合は問題無いですが、1000QSOを超えてくると微妙に数値が合わなくなったりして再計算を何度かすることになります。

この作業のうち②~④迄を自動で実施してくれたら非常に簡単になるので、この部分を自動化するプログラムを考える事にしました。

 

しかし、自分はプログラマーではないので自力でコードを書くことはかなり困難ですので、過去にCQ誌用のDXレポートの自動化を行ったと同じように、Copilotにお願いしてコードを作成してもらい、それをデバッグしながら自分の求める形になるように追い込みました。

まずは8月の実績計算用に、既にExportした8月分のADIFファイルを開いて集計対象となる項目を選びます。

自分の使用しているのはDXkeeperなので、このアプリでは<BAND_RX:3>と言う項目が集計対象となるのが解りましたので、ADIFファイルからこの<BAND_RX:3>の数値をバンド順並び替え、更に各バンドの数値を集計し合計値を大きい順に並び替えます。

それがExcelのbookに入力する数値となります。

これらの一連動作を、Pythonで指定したファイルを開き集計後Excelを起動してbookに書込、ベースの円グラフを作成する迄を作って貰い、後で修正ができるようにExcelのファイルとして保存するようにしました。

文章で書くと直ぐに終わりますが、最初はPythonで集計したデータをPythonのグラフ処理ライブラリを使用して処理したのですが、Excelのグラフほど見栄えが良くないので、途中からExcel連携に切り替えたのです。

データの引き渡しが上手くいかなかったり、勝手にExcelが閉じてしまったりとトラブルは沢山有りましたが、Copilotに細かな指示を出してなんとか目標とする作業を自動化することができました。

これを使うと、月集計用に作ったのですが年間集計も可能になります。

最後は、いちいちPowerShellからPythonで指示を出すのは大変なので、PythonからExeファイルへ変換する処理を行い、Windows用のExeファイルを作成しました。

これを使うと、集計作業が一切なくなるので1分も掛からずにベースの円グラフが作成されます。

後はこれを見栄えの良いように加工すれば完了。今まで何十分も掛かっていた作業が10分掛からずにできるようになりました。

Copilotを使用すれば、プログラミング言語知識が無くてもアプリが作れて最高ですね。

これがCopilotに作成してもらったコードの一部です。

import re
from collections import Counter
from tkinter import Tk, filedialog, simpledialog
import pandas as pd
import win32com.client as win32
import os
import time

def select_adif_file():
root = Tk()
root.withdraw()
return filedialog.askopenfilename(
title="ADIFファイルを選択してください",
filetypes=[("ADIF files", "*.adi"), ("All files", "*.*")]
)

def extract_band_rx_values(adif_text):
return re.findall(r"<BAND_RX:\d+>([^<]+)", adif_text)

def main():
adif_file_path = select_adif_file()
if not adif_file_path:
print("ファイルが選択されませんでした。")
return

with open(adif_file_path, 'r', encoding='utf-8') as file:
adif_content = file.read()

band_rx_values = extract_band_rx_values(adif_content)
if not band_rx_values:
print("BAND_RXのデータが見つかりませんでした。")
return

band_counter = Counter(band_rx_values)
total = sum(band_counter.values())
data = [
{"Band": band, "Count": count, "Ratio (%)": round(count / total * 100, 1)}
for band, count in band_counter.items()
]

df = pd.DataFrame(data)
df_sorted = df.sort_values(by="Count", ascending=False)

root = Tk()
root.withdraw()
title = simpledialog.askstring("Excelファイル名", "保存するExcelファイル名を入力してください(拡張子不要):")
if not title:
title = "BAND_RX集計結果"

 

Windows PCにPythonさえインストールされていれば、テキストエディタとPowerShellで簡単にできますので素晴らしい。Window用のプログラミングアプリは不要なので、何が必要な事を自動化したりするのは便利です。

仕様書さえ出来れば、後は全てCopilotがやってくれるので、自分はできた物を仕様通りか評価するだけです。

すごい時代になったですね。

 

にほんブログ村 その他趣味ブログ アマチュア無線へ にほんブログ村 ↑ブログランキング参加中。クリックでランキングが上がりますので、ご支援をお願いします。

 

ABOUT ME
JE2UFF_Toshi
年々若者のアマチュア無線人口が減る中、何時までも現役でやり続けたく、若き日の想い出を胸に、熱き思いを忘れないように「燃えよDX」と言うタイトルを付けました。単身赴任以降、過熱するDXスロットゲームに違和感を覚え、主力だったHFのアンテナも下ろしてしまったこともあり、燃えるような情熱からいろんな楽しみ方が有るんだ。そう思えるようになって、タイトルもむせん見聞録に変更しコツコツマイペースでやってます。 最近は6mの面白さのハマっています。 更に、長年勤めた会社も退職しサンデー毎日なった事をきっかけに、更にタイトルをきょうも無線日和に変更し、まだまだ続けますよ。
部材購入に困った時は!

digital-dxer.comからのお知らせ

アマチュア無線をやってて困ったことないですか?
何か作りたいが工具が無い、アンテナ作りたいけど材料が無い

そんな時、工具から小さな小物材料、はたまた無線機からアンテナまで何でも簡単購入ができるYahoo!ショッピングが便利です。
クリックすれば後は到着を待つだけ、近くて簡単便利なYahoo!ショッピング。

 

にほんブログ村 その他趣味ブログ アマチュア無線へ にほんブログ村 ↑ブログランキング参加中。クリックでランキングが上がりますので、ご支援をお願いします。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントは日本語で入力してください。(スパム対策)

CAPTCHA