Skip to content

Instantly share code, notes, and snippets.

@chomy
Last active August 21, 2016 02:52
Show Gist options
  • Save chomy/d8bc2ee934886e27b62cbbe65e9f6d2d to your computer and use it in GitHub Desktop.
Save chomy/d8bc2ee934886e27b62cbbe65e9f6d2d to your computer and use it in GitHub Desktop.
JMV3.0 Parser for JTWC
#!/usr/bin/python3
import datetime
import sys
def info_parser(lines, result):
row = lines[0].split(' ')
result['name'] = row[2]
result['number'] = int(row[5])
result['time'] = datetime.datetime(
int(lines[0][0:4]), #year
int(lines[0][4:6]), #month
int(lines[0][6:8]), #day
int(lines[0][8:10]))#hour
return (lines[1:], result)
def forecast_parser(lines, result):
def wind_iterator(lst, tmp):
if(len(lst) == 0 or lst[0] == '' or lst[0][0] != 'R'):
return tmp
#print(lst)
data = {}
data['windspeed'] = int(lst[0][1:])
data['radius'] = (
int(lst[lst.index('NE')-1]),
int(lst[lst.index('SE')-1]),
int(lst[lst.index('SW')-1]),
int(lst[lst.index('NW')-1]))
tmp.append(data)
return wind_iterator(lst[13:],tmp)
def iterator(lines,res):
if(lines[0][0] != 'T'):
return (res, lines)
raw = lines[0].split(' ')
data = {}
#print(raw)
data['time'] = result['time'] + datetime.timedelta(hours=int(raw[0][1:]))
data['position'] = (
int(raw[1][0:3]) * (-1 if(raw[1].find('S')!=-1) else 1) / 10,
int(raw[2][0:4]) * (-1 if(raw[2].find('W')!=-1) else 1) / 10)
data['windspeed'] = int(raw[3])
data['windarea'] = tuple(wind_iterator(raw[4:],[]))
res.append(data)
return iterator(lines[1:], res)
r = iterator(lines, [])
result['forecasts'] = tuple(r[0])
return (r[1], result)
def skip_parser(lines, result, mark):
cdr = lines[1:]
while(cdr[0].find(mark) == -1):
if(len(cdr) == 0):
break
cdr = cdr[1:]
return (cdr[1:], result)
def route_parser(lines, result):
def pos_parser(p):
pos = (int(p[0:3])/10, int(p[4:8])/10)
if(p.find('S') != -1):
pos[0] = pos[0]*-1
if(p.find('W') != -1):
pos[1] = pos[1]*-1
return pos
def time_parser(s):
return datetime.datetime(
int(s[2:4])+2000,
int(s[4:6]),
int(s[6:8]),
int(s[8:10]))
route = []
for l in lines:
if(l.find('NNNN') != -1):
result['route'] = tuple(route)
return ([], result)
row = l.split(' ')
tmp = {}
tmp['postion'] = pos_parser(row[1])
tmp['time'] = time_parser(row[0])
tmp['windspeed'] = int(row[3])
route.append(tmp)
def parse(filename):
lines = []
with open(filename) as f:
for line in f:
lines.append(line.replace('\n',''))
result = (lines[2:], {})
result = info_parser(result[0], result[1])
result = forecast_parser(result[0], result[1])
result = skip_parser(result[0], result[1], '//')
result = route_parser(result[0], result[1])
return result[1]
if(__name__=='__main__'):
FILENAME=sys.argv[1]
print(parse(FILENAME))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment