Ham::WSJTX::Logparse - Parses ALL.TXT log files from Joe Taylor K1JT's WSJT-X, to extract CQ and calling station information for all entries in a given amateur band.


Much inspiration was gained from povaX's ALLmon at Thank you, povaX!


Version 0.01


Extract all log entries for a given band:

    use Ham::WSJTX::Logparse;

    my $log = Ham::WSJTX::Logparse->new();
    # Looks in the default location for the ALL.TXT file
    # or...
    my $log = Ham::WSJTX::Logparse->new("/path/to/an/ALL.TXT");
    # or, can parse multiple logs...
    my $log = Ham::WSJTX::Logparse->new("/tmp/", "/tmp/ALL.TXT.two"); # etc., etc....

    # Define a callback

    my $callback = sub {
       my $date = shift;
       my $time = shift;
       my $power = shift;
       my $offset = shift;
       my $mode = shift;
       my $callsign = shift;
       my $grid = shift;
       print "date $date time $time power $power offset $offset mode $mode callsign $callsign grid $grid\n";
       # sure you can do something interesting with this!

    $log->parseForBand("20m", $callback);
    # many entries are printed....


No functions exported; this has a purely object-oriented module.


new(optional list of files)

Constructs a new parser, given an optional list of files. If no files are given, the default locations will be checked for a WSJT-X ALL.TXT file. Returns a blessed hash.

Note that this module has only been tested on OSX, and the location of default files on non-OSX/Windows platforms is not known to the author at this time; if you know, please inform me as new will die if it tries to load a default file on a platform I haven't coded for.


Returns the list of files that the parser was configured with, or the default file as discovered if no files were supplied in the constructor.

parseForBand($self, $bandOfInterest, $callback)

Parses all discovered or supplied files, correctly determining the date of each 'heard station' entry, and if the entry relates to the band of interest, calls the callback with the entry details.

The 'band of interest' is of the form nnnm, e.g. 20m, 2m, 160m, 2200m. Only one band can be filtered at any time.

The callback is a sub as shown above in the synopsis.

Take care with the 'grid' data in your callback: This is extracted from the logged content of a message, and must be two characers followed by two digits - but if the message was 'M0CUV SV2XYZ RR73', then the grid would be decoded as 'RR73', which is not a valid grid square (of course, this is 'RR 73', but has been concatenated by the SV2 station). Similarly with TU73. In my callback, I use:

    if ($grid =~ /(TU|RR)73/) {
        warn "dodgy data from $date $time $callsign\n";

Better validation may be considered for a later release.

An entry is considered a 'heard station' entry if it has some text (maybe CQ or a callsign), followed by some text (most likely a callsign), followed by a grid square (two characters, two digits - see the note of caution in the previous paragragh).


Matt Gumbley, devzendo at>


Please report any bugs or feature requests to bug-ham-wsjtx-logparse at, or through the web interface at I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.


You can find documentation for this module with the perldoc command.

    perldoc Ham::WSJTX::Logparse

You can also look for information at:


Copyright 2016 Matt Gumbley.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at


Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.