2016-10-06 2 views
1

Я пытаюсь отличить номера рейсов.Отдельные символы и цифры, соответствующие определенным правилам

Example: 
flightno = "FR556" 
split_data = flightno.upcase.match(/([A-Za-z]+)(\d+)/) 
first = split_data[1] # FR 
second = split_data[1] # 556 

Я затем перейти к запросу к базе данных, чтобы найти авиакомпанию на основе FR в этом примере и применять некоторую логику с результатом которой является Ryanair.

Моя проблема в том, когда номер рейса может быть:

flightno = "U21920" 
split_data = flightno.upcase.match(/([A-Za-z]+)(\d+)/) 
first = split_data[1] # U 
second = split_data[1] # 21920 

я в основном хочу первым, чтобы быть U2 не только U. Это используется для поиска в базе данных авиакомпании по их коду IATA в данном случае U2

**** EDIT ** В интересах ясности я сделал некоторые ошибки в терминологии, задавая свой вопрос. Из-за сложности номеров бронирования номера, вход берется из того, что предоставляет пассажир. Например, для полета easyJet пассажир может вводить EZY1920 или U21920, только авиакомпания предоставляет либо так, что пассажир действительно не знает.

«EZY» = ИКАО «U2» = ИАТА

Я беру входные данные от пользователя и попытаться отделить ИКАО или IATA с номером рейса «1920», но нет никакого способа определить, что без поиск в базе данных или разделение ввода, который я считаю громоздким с точки зрения пользователя.

Использование регулярного выражения для разделения символов от цифр работает до тех пор, пока пользователь не вводит IATA в качестве части номера своего рейса (пассажир не знает разницы), и, как вы можете видеть в приведенном выше примере, это смущает регулярное выражение. * *

Проблема в том, что я не могу думать о любом другом шаблоне с номерами рейсов. У них всегда есть как минимум два символа, состоящие из простых букв или смеси буквы и числа, и могут иметь длину 3 символа. Числа могут быть короткими, как 1, но также могут быть длиной 4 - всегда номерами.

**** Редактировать ** Как уже упоминалось в комментариях, нет фиксированного размера, однако одна вещь, которая всегда истинна (по крайней мере до сих пор), является первым символом, всегда будет буквой независимо от того, это ИКАО или ИАТА. Рассмотрев все введенные мной до сих пор данные, я задаюсь вопросом, может ли поиск базы данных и возвращение авиакомпаний с ИАТА или ИКАО, который соответствует первым двум буквам, предоставленным пользователем (U2), (FR), (EZ), может быть одним из способов однако это связано с очевидными проблемами, если должна быть выпущена ИКАО или ИАТА, которая соответствует другой авиакомпании, например «EZY» & «EZT». Это не будущее доказательство, и я ищу лучшие рубиновые или регулярные решения. **

Цените свой ввод.

EDIT

Я ответил на свой вопрос ниже. В то время как другие ответы предоставляют решение для обработки некоторых условий, которые они упадут, если номер полета начнется с номера, поэтому я разработал краткий, но на сегодняшний день стабильный способ анализа строки для цифр, а затем работать, если это ИКАО или ИАТА От этого.

+0

@Wiktor Как он сказал, это не исправлено. ПО: Есть ли вероятность, что номер рейса можно будет сопоставить со списком всех возможных кодов ИКАО? –

+0

Если ваш номер рейса содержит 2-значный код. вы можете разделить его на первые 2 цифры. – user100693

+0

'/ ([A-Za-z] [A-Za-z \ d]) (\ d +) /' – mudasobwa

ответ

0

У меня есть довольно грубое решение, которое, кажется, работает во всех сценариях, которые я могу бросить на него на сегодняшний день. Я хотел сделать это доступным для кого-нибудь еще, что может показаться ему полезным?

Общее правило для кодов полетов/цифры, кажется:

ИАТА: два символа, состоящие из любой комбинации букв и цифр
ИКАО: три символа из букв только (на сегодняшний день)

Учитывая это, мы должны иметь возможность работать, если нам нужно искать базу данных по IATA или ИКАО в зависимости от состояния первых трех символов.

Сначала мы берем номер рейса и преобразовать в прописные

string = "U21920".upcase 

Далее мы проанализируем первые три символа, чтобы проверить наличие номеров.

first_three = string[0,3] # => U21 

Есть ли цифра в first_three?

if first_three =~ /\d/ # => true 
iata = first_three[0,2] # => If true lets get rid of the last character 
# Now we go to the database searching IATA (U2) 

search = Airline.where('iata LIKE ?', "#{iata}%") # => Starts with search, just in case 

В противном случае, если там не цифра найдено в строке

else 
icao = string.match(/([A-Za-z]+)(\d+)/) 
search = Airline.where('icao LIKE ?', "#{icao[1]}%") 

Это похоже на работу для случайных чисел полета Айв протестировали его с сегодняшним днем ​​от нескольких из основного аэропорта живого отправления/доски прибытия. Это интересная проблема, потому что некоторые авиакомпании выдают билеты с кодом ИКАО или ИАТА в качестве части номера рейса, что означает, что пассажиры не будут знать ни одного другого, не говоря уже о том, что некоторые аэропорты предоставляют информацию о рейсе в своем собственном формате, поэтому при условии, что не существует изменения в сборке ИКАО и ИАТА, то вышеуказанное должно работать.

Вот пример скрипта, вы можете запустить

тест.гь

puts "What is your flight number?" 
string = gets.upcase 
first_three = string[0,3] 
puts "Taking first three from #{string} is #{first_three}" 

if first_three =~ /\d/   # Calling String's =~ method. 
puts "The String #{first_three} DOES have a number in it." 
iata = first_three[0,2] 
search = Airline.where('iata LIKE ?', "#{iata}%") 
puts "Searching Airlines starting with IATA #{iata} = #{search.count}" 
puts "Found #{search.first.name} from IATA #{iata}" 
else 
puts "The String #{first_three} does not have a number in it." 
icao = string.match(/([A-Za-z]+)(\d+)/) 
search = Airline.where('icao LIKE ?', "#{icao[1]}%") 
puts "Searching Airlines starting with ICAO #{icao[1]} = #{search.count}" 
puts "Found #{search.first.name} from IATA #{icao[1]}" 
end 

Авиакомпания

Airline(id: integer, name: string, iata: string, icao: string, created_at: datetime, updated_at: datetime) 

палочка это в Lib папку и запустите

рельсы бегун Библиотека/test.rb

Очевидно, что вы можете удалить все статы stateme чтобы получить прямой результат. Я использую rails runner, чтобы включить доступ к моей модели Airline при запуске скрипта.

1

Решение Я думаю о том, что вы подходите свой заданный номер рейса на полный список кодов ICAO/IATA: https://raw.githubusercontent.com/datasets/airport-codes/master/data/airport-codes.csv

Потратив некоторое время с помощью Google может дать вам более соответствующий список.

Затем используйте первые три символа (если это максимум) вашего номера рейса, чтобы найти соответствие в кодах icao. Если вы его найдете, вы узнаете, где отделить вашу строку.

Вот минимальный уродливый пример, который должен установить вас на дорожку. Не стесняйтесь обновлять!

ICAOCODES = %w(FR DEU U21) # grab your data here 

def retrieve_flight_information(flightnumber) 
    ICAOCODES.each do |icao| 
    co = flightnumber.match(icao).to_s 
    if co.length > 0 
     # airline 
     puts co 
     # flight number 
     puts flightnumber.gsub(co,'') 
    end 
    end 
end 

retrieve_flight_information("FR556") 
#=> FR 
#=> 556 
retrieve_flight_information("U21214123") 
#=> U21 
#=> 214123 

Самого большой недостаток заключается в использовании .gsub(), как это может испортить ваш самалёт в случае, если это выглядит следующим образом: "FR21413FR2" Однако вы найдете множество решений этой проблемы на так.

Как указано в комментариях, список кодов icao - это не то, что вы ищете. Но что здесь важно, так это то, что вам как-то нужен список строк, с которыми вы можете безопасно сравнивать.

+0

Кажется, что OP использует код IATA, а не код ИКАО, потому что код ИКАО всегда начинается с 3 алфавитных символов. Однако код IATA может иметь от 2 до 3 буквенно-цифровых символов, обозначающих авиакомпанию, а затем от 1 до 4 цифровых символов, обозначающих полет. Ни часть авиакомпании, ни часть полета не имеют фиксированной длины. – Aetherus

+0

Хорошо, приятно знать. Должен признаться, никогда не общался с ними. Я попытаюсь обобщить ответ. Спасибо –

+0

Я должен признать, что необходим полный список, потому что ни часть авиакомпании, ни часть полета не имеют фиксированной длины. – Aetherus

Смежные вопросы