Move opener to utils and implement batch cdv import

pull/68/head
Konstantin Gründger 2017-06-04 11:52:48 +02:00
rodzic 1f26866ad5
commit c61dc393fe
3 zmienionych plików z 63 dodań i 21 usunięć

Wyświetl plik

@ -134,9 +134,48 @@ def update_relations():
@manager.command @manager.command
def import_aircraft_beacon_logfile(csv_logfile, logfile='main.log', loglevel='INFO'): def import_csv_logfile(path, logfile='main.log', loglevel='INFO'):
"""Import csv logfile <arg: csv logfile>.""" """Import csv logfile <arg: csv logfile>."""
import datetime
import os
if os.path.isfile(path):
print("{}: Importing file: {}".format(datetime.datetime.now(), path))
import_logfile(path)
elif os.path.isdir(path):
print("{}: Scanning path: {}".format(datetime.datetime.now(), path))
for filename in os.listdir(path):
print("{}: Importing file: {}".format(datetime.datetime.now(), filename))
import_logfile(os.path.join(path, filename))
else:
print("{}: Path {} not found.".format(datetime.datetime.now(), path))
print("{}: Finished.".format(datetime.datetime.now()))
def import_logfile(path):
f = open(path, 'r')
try:
header = f.readline().strip()
except UnicodeDecodeError as e:
print("Not a text file: {}".format(path))
f.close()
return
f.close()
aircraft_beacon_header = ','.join(AircraftBeacon.get_csv_columns())
receiver_beacon_header = ','.join(ReceiverBeacon.get_csv_columns())
if header == aircraft_beacon_header:
import_aircraft_beacon_logfile(path)
elif header == receiver_beacon_header:
import_receiver_beacon_logfile(path)
else:
print("Unknown file type: {}".format())
def import_aircraft_beacon_logfile(csv_logfile):
SQL_TEMPTABLE_STATEMENT = """ SQL_TEMPTABLE_STATEMENT = """
CREATE TABLE aircraft_beacon_temp( CREATE TABLE aircraft_beacon_temp(
location geometry, location geometry,
@ -178,7 +217,7 @@ def import_aircraft_beacon_logfile(csv_logfile, logfile='main.log', loglevel='IN
column_names = ','.join(AircraftBeacon.get_csv_columns()) column_names = ','.join(AircraftBeacon.get_csv_columns())
sql = SQL_COPY_STATEMENT % column_names sql = SQL_COPY_STATEMENT % column_names
print("Start importing logfile") print("Start importing logfile: {}".format(csv_logfile))
conn = session.connection().connection conn = session.connection().connection
cursor = conn.cursor() cursor = conn.cursor()
@ -224,8 +263,7 @@ def import_aircraft_beacon_logfile(csv_logfile, logfile='main.log', loglevel='IN
print("Finished") print("Finished")
@manager.command def import_receiver_beacon_logfile(csv_logfile):
def import_receiver_beacon_logfile(csv_logfile, logfile='main.log', loglevel='INFO'):
"""Import csv logfile <arg: csv logfile>.""" """Import csv logfile <arg: csv logfile>."""
SQL_TEMPTABLE_STATEMENT = """ SQL_TEMPTABLE_STATEMENT = """
@ -272,7 +310,7 @@ def import_receiver_beacon_logfile(csv_logfile, logfile='main.log', loglevel='IN
column_names = ','.join(ReceiverBeacon.get_csv_columns()) column_names = ','.join(ReceiverBeacon.get_csv_columns())
sql = SQL_COPY_STATEMENT % column_names sql = SQL_COPY_STATEMENT % column_names
print("Start importing logfile") print("Start importing logfile: {}".format(csv_logfile))
conn = session.connection().connection conn = session.connection().connection
cursor = conn.cursor() cursor = conn.cursor()

Wyświetl plik

@ -5,7 +5,8 @@ from ogn.gateway.process import process_beacon, message_to_beacon
from datetime import datetime from datetime import datetime
from manager import Manager from manager import Manager
from ogn.model import AircraftBeacon, ReceiverBeacon from ogn.model import AircraftBeacon, ReceiverBeacon
import gzip
from ogn.utils import open_file
import os import os
manager = Manager() manager = Manager()
@ -57,7 +58,6 @@ def convert_logfile(path, logfile='main.log', loglevel='INFO'):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
import os
if os.path.isfile(path): if os.path.isfile(path):
logger.info("Reading file: {}".format(path)) logger.info("Reading file: {}".format(path))
convert(path) convert(path)
@ -73,20 +73,10 @@ def convert_logfile(path, logfile='main.log', loglevel='INFO'):
logging.shutdown() logging.shutdown()
def opener(filename):
f = open(filename,'rb')
a = f.read(2)
f.close()
if (a == b'\x1f\x8b'):
f = gzip.open(filename, 'rt')
return f
else:
f = open(filename, 'rt')
return f
def convert(sourcefile, path=''): def convert(sourcefile, path=''):
import re import re
import csv
match = re.search('^.+\.txt\_(\d{4}\-\d{2}\-\d{2})(\.gz)?$', sourcefile) match = re.search('^.+\.txt\_(\d{4}\-\d{2}\-\d{2})(\.gz)?$', sourcefile)
if match: if match:
reference_date = match.group(1) reference_date = match.group(1)
@ -94,7 +84,7 @@ def convert(sourcefile, path=''):
print("filename '{}' does not match pattern".format(sourcefile)) print("filename '{}' does not match pattern".format(sourcefile))
return return
fin = opener(os.path.join(path, sourcefile)) fin = open_file(os.path.join(path, sourcefile))
# get total lines of the input file # get total lines of the input file
total = 0 total = 0
@ -117,7 +107,6 @@ def convert(sourcefile, path=''):
progress = -1 progress = -1
num_lines = 0 num_lines = 0
import csv
wr_ab = csv.writer(fout_ab, delimiter=',') wr_ab = csv.writer(fout_ab, delimiter=',')
wr_ab.writerow(AircraftBeacon.get_csv_columns()) wr_ab.writerow(AircraftBeacon.get_csv_columns())

Wyświetl plik

@ -10,6 +10,8 @@ from geopy.exc import GeopyError
from aerofiles.seeyou import Reader from aerofiles.seeyou import Reader
from ogn.parser.utils import feet2m from ogn.parser.utils import feet2m
import gzip
DDB_URL = "http://ddb.glidernet.org/download/?t=1" DDB_URL = "http://ddb.glidernet.org/download/?t=1"
@ -102,3 +104,16 @@ def get_airports(cupfile):
print('Failed to parse line: {} {}'.format(line, e)) print('Failed to parse line: {} {}'.format(line, e))
return airports return airports
def open_file(filename):
"""Opens a regular or unzipped textfile for reading."""
f = open(filename,'rb')
a = f.read(2)
f.close()
if (a == b'\x1f\x8b'):
f = gzip.open(filename, 'rt')
return f
else:
f = open(filename, 'rt')
return f