timetable
Version:
Using GTFS and other sources to produce beautiful and usable timetables for public transport.
142 lines (128 loc) • 6.46 kB
text/coffeescript
############################################################################################################
# njs_util = require 'util'
# njs_path = require 'path'
njs_fs = require 'fs'
# njs_crypto = require 'crypto'
#...........................................................................................................
# BAP = require 'coffeenode-bitsnpieces'
TYPES = require 'coffeenode-types'
TEXT = require 'coffeenode-text'
TRM = require 'coffeenode-trm'
rpr = TRM.rpr.bind TRM
badge = 'TIMETABLE/read-gtfs-data'
log = TRM.get_logger 'plain', badge
info = TRM.get_logger 'info', badge
whisper = TRM.get_logger 'whisper', badge
alert = TRM.get_logger 'alert', badge
debug = TRM.get_logger 'debug', badge
warn = TRM.get_logger 'warn', badge
help = TRM.get_logger 'help', badge
urge = TRM.get_logger 'urge', badge
echo = TRM.echo.bind TRM
rainbow = TRM.rainbow.bind TRM
#...........................................................................................................
# T = require './TRANSFORMERS'
# as_transformer = T.as_transformer.bind T
# options = require '../options'
# global_data_limit = options[ 'data' ]?[ 'limit' ] ? Infinity
# datasource_infos = ( require './get-datasource-infos' )()
create_readstream = require '../create-readstream'
# REGISTRY = require './REGISTRY'
# #...........................................................................................................
# ASYNC = require 'async'
# #...........................................................................................................
# ### https://github.com/wdavidw/node-csv-parse ###
# _new_csv_parser = require 'csv-parse'
# new_csv_parser = -> _new_csv_parser options[ 'parser' ]
### http://c2fo.github.io/fast-csv/index.html, https://github.com/C2FO/fast-csv ###
# CSV = require 'fast-csv'
#-----------------------------------------------------------------------------------------------------------
ES = require 'event-stream'
# fs = require 'fs'
# transform_stream = require 'stream-transform'
# log = console.log
# as_transformer = ( method ) -> transform_stream method, parallel: 11
# _new_csv_parser = require 'csv-parse'
# new_csv_parser = -> _new_csv_parser delimiter: ','
$ = ES.map.bind ES
#-----------------------------------------------------------------------------------------------------------
@$count = ( input_stream, title ) ->
count = 0
#.........................................................................................................
input_stream.on 'end', ->
info ( title ? 'Count' ) + ':', count
#.........................................................................................................
return $ ( record, handler ) =>
count += 1
handler null, record
#-----------------------------------------------------------------------------------------------------------
@$skip_empty = ->
return $ ( record, handler ) =>
return handler() if record.length is 0
handler null, record
#-----------------------------------------------------------------------------------------------------------
@$show = ->
return $ ( record, handler ) =>
urge rpr record.toString()
# urge rpr record[ record.length - 1 ]
handler null, record
#-----------------------------------------------------------------------------------------------------------
@read_trips = ( route, handler ) ->
# parser = new_csv_parser()
# input = njs_fs.createReadStream route
input = create_readstream route, 'big file'
#.........................................................................................................
input.on 'end', ->
log 'ok: trips'
return handler null
input.setMaxListeners 100 # <<<<<<
#.........................................................................................................
# input.pipe parser
input.pipe ES.split()
# .pipe $signal_end input
.pipe @$skip_empty()
.pipe @$count input, 'trips A'
.pipe @$count input, 'trips B'
.pipe @$count input, 'trips C'
.pipe @$count input, 'trips D'
.pipe @$count input, 'trips E'
.pipe @$count input, 'trips F'
.pipe @$count input, 'trips G'
.pipe @$count input, 'trips H'
.pipe @$count input, 'trips I'
.pipe @$count input, 'trips J'
.pipe @$count input, 'trips K'
.pipe @$count input, 'trips M'
.pipe @$count input, 'trips N'
.pipe @$count input, 'trips O'
.pipe @$count input, 'trips P'
.pipe @$count input, 'trips Q'
.pipe @$count input, 'trips R'
.pipe @$count input, 'trips R'
.pipe @$count input, 'trips S'
.pipe @$count input, 'trips T'
.pipe @$count input, 'trips U'
.pipe @$count input, 'trips V'
.pipe @$count input, 'trips W'
.pipe @$count input, 'trips X'
.pipe @$count input, 'trips Y'
.pipe @$count input, 'trips Z'
# .pipe @$show()
#.........................................................................................................
return null
############################################################################################################
unless module.parent
# route = '/Volumes/Storage/cnd/node_modules/timetable-data/germany-berlin-2014/trips.txt'
# route = '/Volumes/Storage/cnd/node_modules/timetable-data/germany-berlin-2014/calendar.txt'
# route = __filename
route = '/Volumes/Storage/cnd/node_modules/timetable-data/germany-berlin-2014/agency.txt'
@read_trips route, ( error ) ->
throw error if error?
log 'ok'
# CSV_STRING = 'a,b\n' +
# 'a1,b1\n' +
# 'a2,b2\n';
# CSV
# .fromString CSV_STRING, headers: true
# .on 'record', (data) ->
# info data