Skip to content

Instantly share code, notes, and snippets.

@tankerkiller125
Created July 17, 2025 20:46
Show Gist options
  • Save tankerkiller125/ece25eed700ff5309fcbfe6ab2bef889 to your computer and use it in GitHub Desktop.
Save tankerkiller125/ece25eed700ff5309fcbfe6ab2bef889 to your computer and use it in GitHub Desktop.
package main
import (
"encoding/csv"
"github.com/maxmind/mmdbwriter"
"github.com/maxmind/mmdbwriter/inserter"
"github.com/maxmind/mmdbwriter/mmdbtype"
"io"
"log"
"net"
"os"
"strconv"
)
func main() {
csvfile, err := os.Open("input.csv")
csvreader := csv.NewReader(csvfile)
if err != nil {
log.Fatalln("Couldn't open the csv file", err)
}
// Load the database we wish to enrich.
writer, err := mmdbwriter.Load("GeoLite2-City.mmdb", mmdbwriter.Options{ IncludeReservedNetworks: true, Languages: []string{"en"}})
if err != nil {
log.Fatal(err)
}
for {
// Read each record from csv
record, err := csvreader.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
_, sreNet, err := net.ParseCIDR(record[0])
if err != nil {
log.Fatal(err)
}
euBool, err := strconv.ParseBool(record[3])
lat, err := strconv.ParseFloat(record[6], 32)
long, err := strconv.ParseFloat(record[7], 32)
accuracy, err := strconv.ParseInt(record[8], 0, 32)
sreData := mmdbtype.Map{
`continent`: mmdbtype.Map{
`code`: mmdbtype.String(record[1]),
},
`country`: mmdbtype.Map{
`iso_code`: mmdbtype.String(record[2]),
`is_in_european_union`: mmdbtype.Bool(euBool),
},
`subdivisions`: mmdbtype.Slice{
mmdbtype.Map{
`iso_code`: mmdbtype.String(record[4]),
},
},
`city`: mmdbtype.Map{
`names`: mmdbtype.Map{
`en`: mmdbtype.String(record[5]),
},
},
`location`: mmdbtype.Map{
`latitude`: mmdbtype.Float32(lat),
`longitude`: mmdbtype.Float32(long),
`accuracy_radius`: mmdbtype.Int32(accuracy),
`time_zone`: mmdbtype.String(record[9]),
},
`postal`: mmdbtype.Map{
`code`: mmdbtype.String(record[10]),
},
}
if err := writer.InsertFunc(sreNet, inserter.TopLevelMergeWith(sreData)); err != nil {
log.Fatal(err)
}
}
// Write the newly enriched DB to the filesystem.
fh, err := os.Create("GeoLite2-City-with-Local.mmdb")
if err != nil {
log.Fatal(err)
}
_, err = writer.WriteTo(fh)
if err != nil {
log.Fatal(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment