package reader import ( "encoding/csv" "io" "strconv" "git.tornberg.me/go-gtfs/pkg/types" ) func ParseAgencies(r io.Reader, callback func(types.Agency)) error { reader := csv.NewReader(r) // skip header if _, err := reader.Read(); err != nil { return err } for { record, err := reader.Read() if err == io.EOF { break } if err != nil { return err } agency := types.Agency{ AgencyID: record[0], AgencyName: record[1], AgencyURL: record[2], AgencyTimezone: record[3], AgencyLang: record[4], } callback(agency) } return nil } func ParseCalendars(r io.Reader, callback func(types.Calendar)) error { reader := csv.NewReader(r) if _, err := reader.Read(); err != nil { return err } for { record, err := reader.Read() if err == io.EOF { break } if err != nil { return err } monday, _ := strconv.Atoi(record[1]) tuesday, _ := strconv.Atoi(record[2]) wednesday, _ := strconv.Atoi(record[3]) thursday, _ := strconv.Atoi(record[4]) friday, _ := strconv.Atoi(record[5]) saturday, _ := strconv.Atoi(record[6]) sunday, _ := strconv.Atoi(record[7]) calendar := types.Calendar{ ServiceID: record[0], Monday: monday, Tuesday: tuesday, Wednesday: wednesday, Thursday: thursday, Friday: friday, Saturday: saturday, Sunday: sunday, StartDate: record[8], EndDate: record[9], } callback(calendar) } return nil } func ParseCalendarDates(r io.Reader, callback func(types.CalendarDate)) error { reader := csv.NewReader(r) if _, err := reader.Read(); err != nil { return err } for { record, err := reader.Read() if err == io.EOF { break } if err != nil { return err } exceptionType, _ := strconv.Atoi(record[2]) calendarDate := types.CalendarDate{ ServiceID: record[0], Date: record[1], ExceptionType: exceptionType, } callback(calendarDate) } return nil } func ParseFeedInfos(r io.Reader, callback func(types.FeedInfo)) error { reader := csv.NewReader(r) if _, err := reader.Read(); err != nil { return err } for { record, err := reader.Read() if err == io.EOF { break } if err != nil { return err } feedInfo := types.FeedInfo{ FeedID: record[0], FeedPublisherName: record[1], FeedPublisherURL: record[2], FeedLang: record[3], FeedVersion: record[4], } callback(feedInfo) } return nil } func ParseRoutes(r io.Reader, callback func(types.Route)) error { reader := csv.NewReader(r) if _, err := reader.Read(); err != nil { return err } for { record, err := reader.Read() if err == io.EOF { break } if err != nil { return err } routeType, _ := strconv.Atoi(record[4]) route := types.Route{ RouteID: record[0], AgencyID: record[1], RouteShortName: record[2], RouteLongName: record[3], RouteType: routeType, RouteURL: record[5], } callback(route) } return nil } func ParseStopTimes(r io.Reader, callback func(types.StopTime)) error { reader := csv.NewReader(r) if _, err := reader.Read(); err != nil { return err } for { record, err := reader.Read() if err == io.EOF { break } if err != nil { return err } stopSequence, _ := strconv.Atoi(record[4]) pickupType, _ := strconv.Atoi(record[5]) dropOffType, _ := strconv.Atoi(record[6]) stopTime := types.StopTime{ TripID: record[0], ArrivalTime: record[1], DepartureTime: record[2], StopID: record[3], StopSequence: stopSequence, PickupType: pickupType, DropOffType: dropOffType, } callback(stopTime) } return nil } func ParseStops(r io.Reader, callback func(types.Stop)) error { reader := csv.NewReader(r) if _, err := reader.Read(); err != nil { return err } for { record, err := reader.Read() if err == io.EOF { break } if err != nil { return err } stopLat, _ := strconv.ParseFloat(record[2], 64) stopLon, _ := strconv.ParseFloat(record[3], 64) locationType, _ := strconv.Atoi(record[4]) stop := types.Stop{ StopID: record[0], StopName: record[1], StopLat: stopLat, StopLon: stopLon, LocationType: locationType, } callback(stop) } return nil } func ParseTransfers(r io.Reader, callback func(types.Transfer)) error { reader := csv.NewReader(r) if _, err := reader.Read(); err != nil { return err } for { record, err := reader.Read() if err == io.EOF { break } if err != nil { return err } transferType, _ := strconv.Atoi(record[2]) minTransferTime, _ := strconv.Atoi(record[3]) transfer := types.Transfer{ FromStopID: record[0], ToStopID: record[1], TransferType: transferType, MinTransferTime: minTransferTime, FromTripID: record[4], ToTripID: record[5], } callback(transfer) } return nil } func ParseTrips(r io.Reader, callback func(types.Trip)) error { reader := csv.NewReader(r) if _, err := reader.Read(); err != nil { return err } for { record, err := reader.Read() if err == io.EOF { break } if err != nil { return err } trip := types.Trip{ RouteID: record[0], ServiceID: record[1], TripID: record[2], TripHeadsign: record[3], TripShortName: record[4], } callback(trip) } return nil }