2016-10-06 6 views
1

항공편 번호를 구별하려고합니다.특정 규칙에 따라 문자와 숫자가 구분됩니다.

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

I는이 예에서 FR에 따라 항공사를 찾아 라이언 에어 인 결과 몇 가지 논리를 적용 할 데이터베이스를 쿼리로 이동.

항공편 번호가있을 때 내 문제는 다음과 같습니다

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입니다

**** 편집 ** 명확성을 위해 제 질문을 할 때 용어에 몇 가지 실수를했습니다. 예약 참조 번호의 복잡성으로 인해 승객이 제공 한 모든 정보가 입력됩니다. 예를 들어, easyJet 항공편의 경우 EZY1920 또는 U21920을 입력 할 수 있습니다. 따라서 승객은 무지하게됩니다.

"EZY"= ICAO "U2"= IATA는

나는 사용자로부터 입력을 받아 항공편 번호 "1920"에서 ICAO 또는 IATA을 분리하려고하지만, 결정하는 방법이 없습니다없이 그 데이터베이스를 검색하거나 필자가 느끼는 입력을 분리하는 것은 사용자 경험 관점에서보기가 번거롭다.

정규 표현식을 사용하여 숫자와 문자를 구분하면 사용자가 비행 번호의 일부로 IATA를 입력 할 때까지 (승객은 그 차이를 알 수 없습니다.) 위 예제에서 볼 수 있듯이 정규식이 혼란 스럽습니다. * *

문제는 비행 패턴이 다른 패턴을 생각할 수 없습니다. 그들은 항상 문자 또는 문자와 숫자의 혼합으로 구성된 적어도 두 개의 문자가 있으며 길이는 3 문자가 될 수 있습니다. 숫자 부분은 1만큼 짧을 수 있지만 4 - 항상 숫자도 가능합니다.

**** 편집 ** 주석에서 언급했듯이 고정 크기는 없지만 항상 (적어도 지금까지는) 하나의 사실은 첫 문자가 항상 문자 일 것입니다. ICAO 또는 IATA입니다. 지금까지 입력 한 모든 시체를 고려한 후 사용자 (U2), (FR), (EZ)가 제공 한 처음 두 글자와 일치하는 IATA 또는 ICAO를 사용하여 데이터베이스를 검색하고 항공사를 반환하는 것이 한 가지 방법 일지 궁금합니다. 그러나 이것은 예를 들어 "EZY"& "EZT"와 같이 다른 항공사와 일치하는 ICAO 나 IATA가 발표되어야하는 명백한 문제가 될 수 있습니다. 이것은 미래의 증거가 아니며 더 나은 루비 또는 정규식 솔루션을 찾고 있습니다 ** **

귀하의 의견을 감사드립니다.

편집

내가 아래에있는 내 자신의 질문에 대답했다. 다른 답변은 일부 조건을 처리하기위한 솔루션을 제공하지만 항공편 번호가 숫자로 시작되면 아래로 떨어지게되므로 숫자는 문자열을 분석하고 ICAO 또는 IATA 인 경우 안정적인 방식으로 계산합니다. 그것을 통해서. https://raw.githubusercontent.com/datasets/airport-codes/master/data/airport-codes.csv

당신에게 더 적절한 목록을 줄 수도 구글에서 함께 시간을 지출 :

+0

@Wiktor 그가 말했듯이, 그것은 고쳐지지 않았습니다. PO : 가능한 모든 ICAO 코드 목록과 항공편 번호를 비교할 수 있습니까? –

+0

모든 항공편 번호에 2 자리 숫자의 첫 번째 코드가 포함되어있는 경우. 처음 2 자리 숫자로 구분할 수 있습니다. – user100693

+0

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

답변

0

저는 현재까지는 모든 시나리오에서 작동하는 것처럼 보이는 아주 깔끔한 해결책을 가지고 있습니다. 유용하게 사용할 수있는 다른 사람에게이 기능을 제공하고 싶었습니까?

IATA :

비행 코드에 대한 엄지 손가락의 일반적인 규칙은/번호가 될 것으로 보인다 전용 (날짜) 문자 이루어진 3 자

:
ICAO 조합의 문자와 숫자로 구성된 두 글자

처음 세 문자의 조건에 따라 IATA 또는 ICAO를 사용하여 데이터베이스를 검색해야하는 경우이를 해결할 수 있어야합니다.

먼저 우리는 항공편 번호를 가지고 우리가 어떤 번호를 확인하기 위해 처음 세 문자를 분석

string = "U21920".upcase 

다음을 대문자로 변환합니다.

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

first_three의 숫자가 있습니까? 문자열이 주요 공항 라이브 출발 몇에서 오늘 임의의 편명 필자을 위해 그것을 시험 작동하는 것 같다

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

에서 발견 자리를 밤은 그렇지 않은 경우

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 

/도착 보드. 일부 항공사는 ICAO 또는 IATA 코드로 항공권 번호를 발행하기 때문에 흥미로운 문제입니다. 이는 승객들이 전혀 다른 것을 알지 못한다는 것을 의미합니다. 일부 공항은 자체 정보 형식으로 항공편 정보를 제공하므로 ICAO 및 IATA로 변경하면 위의 사항이 적용됩니다. 여기

테스트를 실행할 수있는 예제 스크립트입니다.RB

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 폴더에 스틱이와

은 레일 lib 디렉토리/test.rb 분명히

제거 할 수 있습니다 러너 실행 모든 putem stateme 결과에 곧바로 도달 할 수 있습니다. 레일즈 러너를 사용하여 스크립트를 실행할 때 Airline 모델에 대한 액세스를 포함합니다.

1

내가 생각할 해결책은 ICAO/IATA 코드의 전체 목록에 대한 귀하의 특정 항공편 번호와 일치한다는 것입니다.

그런 다음 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() 그것이이 보이는 경우 엉망 당신 flightnumber을 수도 등을 사용하여있다 : "FR21413FR2" 그러나 당신이 그렇게에이 문제에 대한 해결책을 많이 찾을 수 있습니다.

의견에서 언급했듯이, icao 코드 목록은 찾고자하는 것이 아닙니다. 그러나 여기에 관련된 것은 여러분이 어떻게 든 비교할 수있는 문자열 목록이 필요하다는 것입니다.

+0

ICAO 코드는 항상 알파벳 문자 3 개로 시작하기 때문에 OP는 IATA 코드를 사용하지만 ICAO 코드는 사용하지 않는 것으로 보입니다. 그러나 IATA 코드에는 항공사를 지정하는 2 ~ 3 자의 영숫자 문자와 1 ~ 4 자의 문자를 지정할 수 있습니다. 항공사 부나 비행부 모두 고정 길이가 아닙니다. – Aetherus

+0

알겠습니다. 잘 알고 있습니다. 결코 그들과 연락을 취했다. 나는 인정해야한다. 나는 답을 일반화하려고 노력할 것이다. 고맙습니다. –

+0

항공기 부품과 비행편 모두 고정 길이가 아니기 때문에 완전한 목록이 필요하다는 것을 인정해야합니다. – Aetherus

관련 문제