From 873a0ebe25bc447ae8e19cc751ac1e9e48fd3cab Mon Sep 17 00:00:00 2001 From: ceb515 Date: Thu, 11 Jul 2024 09:57:04 -0400 Subject: [PATCH] add cabrillostats --- README.md | 3 +++ cabrilloStats.py | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 cabrilloStats.py diff --git a/README.md b/README.md index 56dd37e..89207ff 100644 --- a/README.md +++ b/README.md @@ -11,3 +11,6 @@ ADIF Converter can take command line arguments (input and output file), or it wi ## squirlConverter Squirl converter is a bit simpler to use. Put all of the exported log TXT files into the same directory as the script, and give it an argument for the name of the output file (it will default to "output.txt"). It will also have you enter the header information, and output another single large cabrillo file. + +## cabrilloStats +CabrilloStats is a simple tool to find how many contacts were made per band and mode, which is helpful in submission to the ARRL. \ No newline at end of file diff --git a/cabrilloStats.py b/cabrilloStats.py new file mode 100644 index 0000000..acbebde --- /dev/null +++ b/cabrilloStats.py @@ -0,0 +1,70 @@ +import re +import pandas as pd +import argparse + +# Define the frequency to band conversion +frequency_to_band = { + '1800': '160m', + '3500': '80m', + '7000': '40m', + '14000': '20m', + '21000': '15m', + '28000': '10m', +} + +# Define a function to parse the QSO lines +def parse_qso_line(line): + # Use regex to match the QSO line and extract the mode and frequency + match = re.match(r"QSO:\s+(\d+)\s+(\w+)\s+\d{4}-\d{2}-\d{2}\s+\d{4}\s+\w+\s+\w+\s+\w+\s+\w+", line) + if match: + frequency, mode = match.groups() + band = frequency_to_band.get(frequency, None) # Convert frequency to band + if band: + return mode, band + return None, None + +# Define a function to read the log file and count QSOs +def read_log_file(file_path): + # Initialize counters for QSOs + counts = {'CW': {}, 'PH': {}, 'RY': {}, 'DG': {}} + + # Read the log file + with open(file_path, 'r') as file: + for line in file: + if line.startswith('QSO:'): + mode, band = parse_qso_line(line.strip()) + if mode and mode in counts: + if band not in counts[mode]: + counts[mode][band] = 0 + counts[mode][band] += 1 + + # Convert counts to a DataFrame for better display + # Define all possible bands + all_bands = ['160m', '80m', '40m', '20m', '15m', '10m'] + + # Initialize the DataFrame with all bands and modes + data = {band: {mode: counts[mode].get(band, 0) for mode in ['CW', 'DG', 'PH', 'RY']} for band in all_bands} + df = pd.DataFrame(data).T.fillna(0).astype(int) + + return df + +# Define a function to print the results +def print_summary(df): + print("QSO Counts by Band and Mode:") + print(df) + +# Main function to run the script +def main(): + # Set up command line argument parsing + parser = argparse.ArgumentParser(description="Process a log file to count QSOs by band and mode.") + parser.add_argument('file_path', help="Path to the log file") + args = parser.parse_args() + + # Read the log file and get QSO counts + df = read_log_file(args.file_path) + + # Print the summary + print_summary(df) + +if __name__ == "__main__": + main()