def input(self, csv_path): """Takes csv input from command-line and checks for errors""" # test_routes_csv = csv.reader(io.open( # csv_path.csv_file_path, "r", encoding=csv_path.encoding), delimiter=",", quotechar='"') inputFile = open(csv_path.csv_file_path, 'r', encoding='utf-8') fileReader = csv.reader(inputFile, delimiter=',') finalCsv = [] aircrafts = [] aircraftRange = [] for row in fileReader: self.__csv_data = [] # print("ROW:::", row) #finding duplicate values D = [k for k, v in Counter(row).items() if v > 1] if len(D) != 0: print("There are duplicate values") #dont append row to csv_data _airdict = Airport() parsedAirportDict = _airdict.parseAirport('airport.csv') parsedAircraft = _airdict.Aircraft('aircraft.csv') # print(parsedAircraft) #Checking for incorrect IATA codes dests = row[:-1] # print(dests) if len(dests) <= 1: print("Need to enter a minimum of 2 aircodes", '\n') else: for i in dests: if i in list(parsedAirportDict.keys()): self.__csv_data.append(i) else: print("Incorrect IATA entered", '\n') #Presuming Aircraft code will always be last item in csv file aircraft_code = row[-1] #print(aircraft_code) if aircraft_code in list(parsedAircraft.keys()): print("Aircraft range for", aircraft_code, "is:", parsedAircraft.get(aircraft_code)) #self.__csv_data.append(parsedAircraft.get(aircraft_code)) else: print("Warning, please specify aircraft model") aircrafts.append(aircraft_code) aircraftRange.append(parsedAircraft.get(aircraft_code)) finalCsv.append(self.__csv_data) return finalCsv, aircrafts, aircraftRange
def main(): parser = argparse.ArgumentParser() parser.add_argument("csv_file_path") parser.add_argument("--encoding", default="utf_8") options = parser.parse_args() _utObject = utils() testCsv, aircraftCode, aircraftRange = _utObject.input(options) # print("TESTCSV:::::::::",testCsv) # print(aircraftCode) # print(aircraftRange) outputList = [] _airdict = Airport() parsedAirportDict = _airdict.parseAirport('airport.csv') for tCi, tC in enumerate(testCsv): #Iterates over IATA code in testCsv storing their into a dictionary as tuples #Saving lat and long values for each IATA distances = {} for row in tC: data = parsedAirportDict.get(row) distances[row] = data # print(distances) #Calculating all possible distances between routes and storing them in a dict dict_air = {} for airs in distances: src = airs indivDist = [] for airs2 in distances: dest = airs2 indivDist.append( _airdict.distanceBetweenAirports(distances[src][0], distances[src][1], distances[dest][0], distances[dest][1])) dict_air[src] = indivDist #print(dict_air) #transform nodes(keys) of dict into a sequence graph_nodes = (list(dict_air.keys())) # _min_distance_obj = MinDist() # shortest_path = _min_distance_obj.bruteForce(graph_nodes,dict_air) airports_visited = [] min_dist = [] airIndices = [] new_source = graph_nodes[0] # airIndices.append(0) for s in graph_nodes: # print("Destination:", new_source) airports_visited.append(new_source) distances = dict_air.get(new_source) for i in airIndices: # print(s) distances[i] = 9999999 # print(distances) index = -1 for i, element in enumerate(distances): if element == 0: index = i distances[i] = 9999999 airIndices.append(index) mDist = min(distances) #print(mDist) airpIndex = distances.index(mDist) airIndices.append(airpIndex) #print("Index:",airpIndex) new_source = graph_nodes[airpIndex] min_dist.append(min(distances)) #Popping last element off stack to get 4 shortest distances min_dist.pop() #print(min_dist) finalSource = airports_visited[-1] finalDestination = airports_visited[0] finalSourceDist = parsedAirportDict.get(finalSource) finalDestinationDist = parsedAirportDict.get(finalDestination) finalDistance = _airdict.distanceBetweenAirports( finalSourceDist[0], finalSourceDist[1], finalDestinationDist[0], finalDestinationDist[1]) #print(finalDistance) #Append final dist to list of distances airports_visited.append(finalDestination) print("Itinerary:", airports_visited, '\n') min_dist.append(finalDistance) print("Itinerary Distances:", min_dist, '\n') print('________________________________________________', '\n') #Destination is the last index of airports_visited list _currencyobject = Currency() parsedCurrencyCost = _currencyobject.currencyParser( 'Currency_code_concat.csv') billingCountry = airports_visited[-1] _costObject = Cost() toEuroRate = _costObject.toEuroRate(billingCountry, 'airport.csv', 'countrycurrency.csv', 'currencyrates.csv') print(toEuroRate) print("Cost of round trip: ", "€", (sum(min_dist) // toEuroRate)) #Also calculate distance from last dest in list to home # print('________________________________________________') print("Checking if Itinerary is possible with provided aircraft") journeyPossible = _airdict.isItineraryPossible(aircraftRange[tCi], min_dist) if journeyPossible == False: print( "Sorry, with the provided aircraft this journey cannot be made. Try again!" ) airports_visited.append("No Route") outputList.append(airports_visited) else: remainingFuel = aircraftRange[tCi] print("\t\t\tRemaining Fuel::: ", remainingFuel) totalCosttoRefuel = 0 toEuroRate = _costObject.toEuroRate(airports_visited[0], 'airport.csv', 'countrycurrency.csv', 'currencyrates.csv') print("\t\t\t\t\tItinerary Scheduled: ", airports_visited) print("\t\t\t\t\tItinerary Scheduled: ", min_dist) totalCosttoRefuel += aircraftRange[tCi] * toEuroRate for i, val in enumerate(min_dist): toEuroRate = _costObject.toEuroRate(airports_visited[i + 1], 'airport.csv', 'countrycurrency.csv', 'currencyrates.csv') print("\t\t\tAT Airport: ", airports_visited[i + 1]) print("\t\t\tAT Airport: ", airports_visited[i + 1], "the EURO Rate is: ", toEuroRate) if remainingFuel >= val: print("\t\t\t\tProceeding") remainingFuel -= val else: print("\t\t\tRefueling") costOfRefuel = (aircraftRange[tCi] - remainingFuel) * toEuroRate totalCosttoRefuel += costOfRefuel remainingFuel = aircraftRange[tCi] - val print("\t\t\t\t", costOfRefuel) print("\t\t\t\tRemaining", remainingFuel) airports_visited.append(totalCosttoRefuel) outputList.append(airports_visited) print("TOTAL COST FOR ITINERARY IS: ", totalCosttoRefuel) print("Generating output csv file") _utObject.tocsv(outputList)