summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoop Kiefte <ikojba@gmail.com>2023-08-08 18:52:51 +0100
committerJoop Kiefte <ikojba@gmail.com>2023-08-08 18:52:51 +0100
commit0a23f0354a86d0f123d3287d4ae6f785f895bffa (patch)
treea64e738f9b27c7fa715f931d2852c50ef51574a4
Initial commit, code doesn't work yet
-rw-r--r--main.go111
1 files changed, 111 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..d1ea657
--- /dev/null
+++ b/main.go
@@ -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)
+}