diff options
author | Joop Kiefte <ikojba@gmail.com> | 2023-08-08 18:52:51 +0100 |
---|---|---|
committer | Joop Kiefte <ikojba@gmail.com> | 2023-08-08 18:52:51 +0100 |
commit | 0a23f0354a86d0f123d3287d4ae6f785f895bffa (patch) | |
tree | a64e738f9b27c7fa715f931d2852c50ef51574a4 |
Initial commit, code doesn't work yet
-rw-r--r-- | main.go | 111 |
1 files changed, 111 insertions, 0 deletions
@@ -0,0 +1,111 @@ +// gtfsdb is a command line tool to roundtrip GTFS data to MySQL.. +// It's especially powerful when used with Dolt. +package main + +import ( + "archive/zip" + "fmt" + "io" + "net/http" + "os" + "path/filepath" + "strings" +) + +type GTFS map[string][]string + +func readFromURL(url string) GTFS { + // Get GTFS zip file from URL + resp, err := http.Get(url) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + defer resp.Body.Close() + + // Read zip file + return readFromZip(resp.Body) +} + +func readFromFile(filename string) GTFS { + // Open GTFS zip file + file, err := os.Open(filename) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + defer file.Close() + + // Read zip file + return readFromZip(file) +} + +func readFromZip(file io.Reader) GTFS { + // Open zip file + r, err := zip.NewReader(file, 0) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + // Read zip file + gtfs := make(GTFS) + for _, f := range r.File { + // Open file + rc, err := f.Open() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + defer rc.Close() + + // Read file into GTFS, removing .txt extension + table := strings.TrimSuffix(f.Name, filepath.Ext(f.Name)) + gtfs[table] = readFromCSV(rc) + } + + return gtfs +} + +func writeToDir(gtfs GTFS) { + for table, rows := range gtfs { + // Open file + file, err := os.Create(table + ".csv") + if err != nil { + fmt.Println(err) + os.Exit(1) + } + defer file.Close() + + // Write rows + for _, row := range rows { + _, err := io.WriteString(file, row+"\n") + if err != nil { + fmt.Println(err) + os.Exit(1) + } + } + } +} + +func main() { + // Read filename from command line and write contents of zip to current directory as CSV files + var filename string + if len(os.Args) > 1 { + filename = os.Args[1] + } else { + fmt.Println("Please provide a URL or filename") + os.Exit(1) + } + + // Read GTFS zip file from URL or filename + var gtfs GTFS + if strings.HasPrefix(filename, "http") { + gtfs = readFromURL(filename) + } else { + gtfs = readFromFile(filename) + } + + // Write GTFS to current directory + writeToDir(gtfs) +} |