Skip to content

Commit 9d64849

Browse files
committed
Add goadifdxcccl, update README.md
1 parent dfb31c6 commit 9d64849

File tree

2 files changed

+188
-2
lines changed

2 files changed

+188
-2
lines changed

README.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Go tools for ADIF ADI files
1010
* goadifdedupe: dump QSOs WITH deduping (eliminating dupe QSOs)
1111
* goadifdump: skeleton for further writing the code
1212
* goadifdxcc: add missing DXCC fields using godxcc
13+
* goadifdxcccl: add missing DXCC fields using gocldb
1314
* goadifgrep: search specified ADIF field with a regex and output matched ADIF record
1415
* goadifstat: obtain QSO statistics
1516
* goadiftime: sort and filter QSOs by QSO\_DATE/TIME\_ON fields
@@ -29,8 +30,9 @@ Do `./buildall.sh`
2930

3031
## Required libraries
3132

32-
https://github.com/jj1bdx/adifparser
33-
https://github.com/jj1bdx/godxcc
33+
* https://github.com/jj1bdx/adifparser
34+
* https://github.com/jj1bdx/gocldb
35+
* https://github.com/jj1bdx/godxcc
3436

3537
## Usage examples
3638

goadifdxcccl/goadifdxcccl.go

+184
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
// goadifdxcccl: add DXCC/CQ Zone info with Club Log database reference
2+
// by Kenji Rikitake, JJ1BDX
3+
// Usage: goadifdxcc [-f infile] [-o outfile]
4+
5+
package main
6+
7+
import (
8+
"flag"
9+
"fmt"
10+
"github.com/jj1bdx/adifparser"
11+
"github.com/jj1bdx/gocldb"
12+
"io"
13+
"os"
14+
"strconv"
15+
"strings"
16+
"time"
17+
)
18+
19+
func main() {
20+
var infile = flag.String("f", "", "input file (stdout in none)")
21+
var outfile = flag.String("o", "", "output file (stdout if none)")
22+
23+
var fp *os.File
24+
var err error
25+
26+
flag.Usage = func() {
27+
execname := os.Args[0]
28+
fmt.Fprintln(flag.CommandLine.Output(),
29+
"goadifdxcc: add DXCC/CQ Zone fields using gocldb")
30+
fmt.Fprintf(flag.CommandLine.Output(),
31+
"Usage: %s [-f infile] [-o outfile]\n", execname)
32+
fmt.Fprintf(flag.CommandLine.Output(), "\n")
33+
fmt.Fprintf(flag.CommandLine.Output(),
34+
"How goadifdxcc works:\n"+
35+
"For each record, fetch the correspoding local Club Log database data\n"+
36+
"with the content of the ADIF field 'call'.\n"+
37+
"Then for each ADIF field of country, cqz, cont, dxcc:\n"+
38+
"fill in the field with the DXCC database data if the field is empty.\n")
39+
fmt.Fprintf(flag.CommandLine.Output(),
40+
"Note well:\n"+
41+
"gocldb does not handle ITU Zone info\n")
42+
flag.PrintDefaults()
43+
}
44+
45+
flag.Parse()
46+
47+
if *infile == "" {
48+
fp = os.Stdin
49+
} else {
50+
fp, err = os.Open(*infile)
51+
if err != nil {
52+
fmt.Fprint(os.Stderr, err)
53+
return
54+
}
55+
}
56+
57+
var writer adifparser.ADIFWriter
58+
var writefp *os.File
59+
if *outfile != "" {
60+
if _, err := os.Stat(*outfile); os.IsNotExist(err) {
61+
// File does not exist: create it
62+
writefp, err = os.Create(*outfile)
63+
if err != nil {
64+
fmt.Fprint(os.Stderr, err)
65+
return
66+
}
67+
} else {
68+
fmt.Fprintf(os.Stderr, "Error: file %s already exists\n", *outfile)
69+
return
70+
}
71+
writer = adifparser.NewADIFWriter(writefp)
72+
} else {
73+
writefp = nil
74+
writer = adifparser.NewADIFWriter(os.Stdout)
75+
}
76+
77+
// Initialize gocldb
78+
gocldb.LoadCtyXml()
79+
// Disable debug mode logging of gocldb
80+
gocldb.DebugLogger.SetOutput(io.Discard)
81+
82+
if writer.SetComment("goadifdxcccl\n") != nil {
83+
fmt.Fprint(os.Stderr, err)
84+
return
85+
}
86+
87+
reader := adifparser.NewADIFReader(fp)
88+
for record, err := reader.ReadRecord(); record != nil || err != nil; record, err = reader.ReadRecord() {
89+
if err != nil {
90+
if err != io.EOF {
91+
fmt.Fprint(os.Stderr, err)
92+
}
93+
break // when io.EOF break the loop!
94+
}
95+
96+
// Get callsign entry
97+
call, err := record.GetValue("call")
98+
if err != nil {
99+
fmt.Fprint(os.Stderr, err)
100+
continue
101+
}
102+
// Get time entry from QSO_DATE and TIME_ON fields
103+
adifdate, err := record.GetValue("qso_date")
104+
if err != nil {
105+
fmt.Fprint(os.Stderr, err)
106+
return
107+
}
108+
adiftime, err := record.GetValue("time_on")
109+
if err != nil {
110+
fmt.Fprint(os.Stderr, err)
111+
return
112+
}
113+
114+
adifyear, err := strconv.Atoi(adifdate[0:4])
115+
if err != nil {
116+
fmt.Fprint(os.Stderr, err)
117+
return
118+
}
119+
adifmonth, err := strconv.Atoi(adifdate[4:6])
120+
if err != nil {
121+
fmt.Fprint(os.Stderr, err)
122+
return
123+
}
124+
adifday, err := strconv.Atoi(adifdate[6:8])
125+
if err != nil {
126+
fmt.Fprint(os.Stderr, err)
127+
return
128+
}
129+
adifhour, err := strconv.Atoi(adiftime[0:2])
130+
if err != nil {
131+
fmt.Fprint(os.Stderr, err)
132+
return
133+
}
134+
adifminute, err := strconv.Atoi(adiftime[2:4])
135+
if err != nil {
136+
fmt.Fprint(os.Stderr, err)
137+
return
138+
}
139+
adifsecond := 0
140+
if len(adiftime) > 4 {
141+
adifsecond, err = strconv.Atoi(adiftime[4:6])
142+
}
143+
recordtime := time.Date(
144+
adifyear, time.Month(adifmonth), adifday,
145+
adifhour, adifminute, adifsecond,
146+
0, time.UTC)
147+
148+
// Fetch DXCC database data
149+
result, err := gocldb.CheckCallsign(strings.ToUpper(call), recordtime)
150+
if err == nil {
151+
152+
// For each ADIF field of country, cqz, cont, dxcc:
153+
// If each field is empty,
154+
// fill in the field with the DXCC database data
155+
// If already filled, do nothing
156+
_, err = record.GetValue("country")
157+
if err == adifparser.ErrNoSuchField {
158+
record.SetValue("country", result.Name)
159+
}
160+
_, err = record.GetValue("cqz")
161+
if err == adifparser.ErrNoSuchField {
162+
record.SetValue("cqz", strconv.Itoa(int(result.Cqz)))
163+
}
164+
_, err = record.GetValue("cont")
165+
if err == adifparser.ErrNoSuchField {
166+
record.SetValue("cont", result.Cont)
167+
}
168+
_, err = record.GetValue("dxcc")
169+
if err == adifparser.ErrNoSuchField {
170+
record.SetValue("dxcc", strconv.Itoa(int(result.Adif)))
171+
}
172+
}
173+
174+
// Write the record
175+
writer.WriteRecord(record)
176+
177+
}
178+
179+
// Flush and close the output
180+
writer.Flush()
181+
if writefp != os.Stdout {
182+
writefp.Close()
183+
}
184+
}

0 commit comments

Comments
 (0)