Небольшая заметка на тему получения данных из файла в формате ADIF. Будет полезна для анализа лога любительской радиостанции.
В процессе подготовки QSL карточек для позывного RP79AB, который звучал в рамках «Мемориала Победа-79«, возникла необходимость преобразовать лог в формате ADIF в таблицу Excel, содержащую только необходимые поля.
Язык Python прекрасно справляется с такой задачей. Так появился на свет несложный скрипт.
Сначала нужно установить необходимую библиотеку для работы с электронными таблицами.
pip install openpyxl
Исходный текст python-скрипта:
import os
import argparse
from openpyxl import Workbook
from openpyxl.styles import Font
import chardet
def parse_adif_to_excel(input_file, output_file):
"""
Парсит ADIF-файл и сохраняет данные в Excel-таблицу.
:param input_file: Имя входного ADIF-файла.
:param output_file: Имя выходного Excel-файла.
"""
# Проверка существования файла
if not os.path.exists(input_file):
print(f"Ошибка: файл '{input_file}' не найден.")
return
# Автоматическое определение кодировки
try:
with open(input_file, 'rb') as f:
raw_data = f.read()
result = chardet.detect(raw_data)
encoding = result['encoding']
print(f"Кодировка файла: {encoding}")
except Exception as e:
print(f"Ошибка кодировки: {e}")
return
# Создаём новую книгу Excel и выбираем активный лист
wb = Workbook()
ws = wb.active
# Заголовки столбцов
headers = ["Дата", "Время", "Диапазон", "Режим", "Позывной", "RST"]
ws.append(headers)
# Жирный шрифт для заголовков
for cell in ws[1]:
cell.font = Font(bold=True)
# Настройка ширины столбцов
column_widths = [15, 10, 10, 10, 15, 10]
for i, width in enumerate(column_widths, start=1):
ws.column_dimensions[chr(64 + i)].width = width
# Чтение и парсинг ADIF-файла
try:
with open(input_file, 'r', encoding=encoding, errors='replace') as inp_file:
# Читаем весь файл и разбиваем на записи по <EOR>
adif_data = inp_file.read()
records = adif_data.split('<EOR>')
for record in records:
# Извлекаем значения из тегов
qso_date_value = extract_tag_value(record, 'QSO_DATE')
time_on_value = extract_tag_value(record, 'TIME_ON')
band_value = extract_tag_value(record, 'BAND')
mode_value = extract_tag_value(record, 'MODE')
call_value = extract_tag_value(record, 'CALL')
rst_send_value = extract_tag_value(record, 'RST_SENT')
# Добавляем строку в таблицу
ws.append([qso_date_value, time_on_value, band_value, mode_value, call_value, rst_send_value])
# Сохраняем книгу в файл
wb.save(output_file)
print(f"Файл Excel создан: {output_file}")
except Exception as e:
print(f"Ошибка открытия файла: {e}")
def extract_tag_value(record, tag):
"""Извлекает значение тега из записи."""
start_tag = f"<{tag}:"
start_pos = record.find(start_tag)
if start_pos == -1:
return ''
start_value = record.find('>', start_pos) + 1
end_value = record.find('<', start_value)
return record[start_value:end_value]
def main():
# Настройка аргументов командной строки
parser = argparse.ArgumentParser(description="Парсинг ADIF-файла и экспорт в Excel.")
parser.add_argument("input_file", help="Имя входного ADIF-файла.")
parser.add_argument("output_file", nargs='?', default="log.xlsx", help="Имя выходного Excel-файла (по умолчанию 'log.xlsx').")
args = parser.parse_args()
parse_adif_to_excel(args.input_file, args.output_file)
if __name__ == "__main__":
main()
Я постарался его максимально подробно документировать. При желании, можно менять экспортируемые поля. Например, добавить поле RDA или страна по DXCC.
Скрипт принимает на вход два аргумента — входной файл adif и выходной файл xlsx. Пример использования:
python3 script.py rp79ab.adif rp79ab_list.xlsx
Так же доступна справка:
python3 script.py --help usage: script.py [-h] input_file [output_file] Парсинг ADIF-файла и экспорт в Excel. positional arguments: input_file Имя входного ADIF-файла. output_file Имя выходного Excel-файла (по умолчанию 'log.xlsx'). optional arguments: -h, --help show this help message and exit
Пример содержимого выходного Excel-файла:
Думаю, скрипт может быть полезен для анализа своего или чужого лога, для сортировки, фильтрации и анализа, или для печати наклеек на QSL-карточки.



Добрый день! Спасибо большое за информацию. Немного почитал сайт ADIF. Интересно, может уже есть готовые библиотеки (предпочтительно на Java), позволяющие читать/ писать ADIF файлы? Можно, конечно, самому написать. Но будет, скорее всего, не полная поддержка стандарта. Да и не будет обновляться вместе со стандартом. В любом случае, спасибо за ссылку на официальный сайт.
С уважением, Дмитрий, UA9MQJ.
73!
Для Java я не искал, но для python есть несколько вариантов.