This commit is contained in:
matst80
2025-11-14 20:21:53 +01:00
commit 4dbbd30d4d
38 changed files with 10969837 additions and 0 deletions

259
pkg/reader/csvreader.go Normal file
View File

@@ -0,0 +1,259 @@
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
}