From 99440a393af0fcf29b1610a059ef065903e916a5 Mon Sep 17 00:00:00 2001 From: zhiqiang feng Date: Tue, 5 Jan 2021 18:04:17 +0800 Subject: [PATCH] fix composite --- parser/aftn.go | 69 +++++++++++++++++++++++++++------------------ parser/aftn_test.go | 37 ++++++++++++++++++++++-- parser/telegram.go | 5 ++++ 3 files changed, 80 insertions(+), 31 deletions(-) diff --git a/parser/aftn.go b/parser/aftn.go index 58bba5d..4fe3094 100644 --- a/parser/aftn.go +++ b/parser/aftn.go @@ -2,8 +2,8 @@ package parser import ( "errors" + "fmt" "regexp" - "strings" ) const ( @@ -15,31 +15,57 @@ const ( TypeFlightPlan = "FPL" TypeDelay = "DLA" - DepRegex = `-?(?P\w+\d{0,4})` - ArrRegex = `-?(?P\w+\d{0,4})` - PlaneRegex = `-?(?P\w+\d+\/?\w\d+)` - DofRegex = `-?(?PDOF\/\d{6})?` - KeyPlane = "plane" + DepRegex = `(?P[A-Z]+\d{0,4})` + ArrRegex = `(?P[A-Z]+\d{0,4})` + PlaneRegex = `(?P\w+\d+\/?\w\d+)` + AircraftRegex = `-?(?P[\w\/]+)` + DofRegex = `-?(?PDOF\/\d{6})?` + OtherRegex = `-?(?P[A-Z0-9\/ \n\r]+)` + /** * example: * (ARR-CSN3126/A5040-ZSPD-ZBTJ1601) * (DEP-CSN3125/A4553-ZGHA0554-ZBTJ-DOF/120820) */ - CompositeDepArr = `(?m)\(\[A-Z]{3}` + PlaneRegex + DepRegex + ArrRegex + DofRegex + `\)` + CompositeDepArr = `(?m)\([A-Z]{3}-` + PlaneRegex + "-" + DepRegex + "-" + ArrRegex + DofRegex + `\)` /** * sample: * (DLA‐ABC123‐NZAA0145‐VTBS‐DOF/091120) */ - CompositeDelay = `(?m)\(DLA` + PlaneRegex + DepRegex + ArrRegex + DofRegex + `\)` + CompositeDelay = `(?m)\(DLA-` + PlaneRegex + "-" + DepRegex + "-" + ArrRegex + DofRegex + `\)` KeyDeparture = "dep" KeyArrival = "arr" KeyDof = "dof" + KeyPlane = "plane" + KeyAircraft = "aircraft" + KeyOther = "other" + KeyTime = "time" ) var flopRegex = regexp.MustCompile(FlopRegex) +/** +* example: +* (FPL-AAR997-IS +* -B763/H-SDHIPRWZ/S +* -RKSI0120 +* -N0473F320 NOPIK1B NOPIK G597 GONAV/N0473F320 G597 AGAVO/K0876S0980 +* G597 DONVO A326 ANRAT ANRAT2A +* -ZBTJ0126 ZBAA +* -EET/ZSHA0025 ZYSH0039 ZBPE0059 REG/HL7507 SEL/KRHJ OPR/AAR +* DOF/090516 RMK/TCAS II EQUIPPED NAV/RNAV1 RNAV5 STS/CARGO) +* NNNN + */ +var CompositeFlightPlan = `(?m)\(FPL-` + PlaneRegex + `-IS( |\n)+` + + AircraftRegex + getOtherRegexWithName("p1") + "-" + + DepRegex + `[ \n]+-` + + getOtherRegexWithName("p2") + "-" + + ArrRegex + ` \w+[ \n]+-` + + getOtherRegexWithName("p3") + `\)` + func parseArrOrDep(telegram *Telegram, data string) { + fmt.Println(CompositeDepArr) fields := getFields(CompositeDepArr, data) if len(fields) < 1 { telegram.ParseErrors = append(telegram.ParseErrors, errors.New("data less than 4 ")) @@ -59,26 +85,13 @@ func parseArrOrDep(telegram *Telegram, data string) { } func parseFlightPlan(telegram *Telegram, data string) { - /** - * example: - * (FPL-AAR997-IS - * -B763/H-SDHIPRWZ/S - * -RKSI0120 - * -N0473F320 NOPIK1B NOPIK G597 GONAV/N0473F320 G597 AGAVO/K0876S0980 - * G597 DONVO A326 ANRAT ANRAT2A - * -ZBTJ0126 ZBAA - * -EET/ZSHA0025 ZYSH0039 ZBPE0059 REG/HL7507 SEL/KRHJ OPR/AAR - * DOF/090516 RMK/TCAS II EQUIPPED NAV/RNAV1 RNAV5 STS/CARGO) - * NNNN - */ - values := getSplitValues(data) - telegram.FlightNumber = values[1] - telegram.Plane = values[3] - telegram.Departure, telegram.DepartureTime = parseAirportAndTime(values[5]) - destString := strings.Split(values[7], " ") - telegram.Destination, telegram.DestinationTime = parseAirportAndTime(destString[0]) - telegram.DateOfFlight = parseDof(values[8]) - + fmt.Println(CompositeFlightPlan) + fields := getFields(CompositeFlightPlan, data) + telegram.FlightNumber, _ = parseFlight(fields[KeyPlane]) + telegram.Aircraft = fields[KeyAircraft] + telegram.Departure, telegram.DepartureTime = parseAirportAndTime(fields[KeyDeparture]) + telegram.Destination, telegram.DestinationTime = parseAirportAndTime(fields[KeyArrival]) + telegram.DateOfFlight = parseDof(fields["p3"]) } func parseDelay(telegram *Telegram, data string) { diff --git a/parser/aftn_test.go b/parser/aftn_test.go index 025589c..d854e3a 100644 --- a/parser/aftn_test.go +++ b/parser/aftn_test.go @@ -7,7 +7,7 @@ import ( func TestAirportAndTimeRegex(t *testing.T) { ast := assert.New(t) - text := "ZBTJ0554" + text := "-ZBTJ0554" fields := getFields(DepRegex, text) ast.Equal(1, len(fields), "Should get 1 filed") @@ -23,13 +23,21 @@ func TestAirportAndTimeRegex(t *testing.T) { func TestPlaneRegex(t *testing.T) { ast := assert.New(t) - text := "JAE7433/A0132" + text := "-JAE7433/A0132" fields := getFields(PlaneRegex, text) ast.Equal(1, len(fields), "Should get plane value") ast.Equal("JAE7433/A0132", fields[KeyPlane]) } +func TestAircraftRegex(t *testing.T) { + ast := assert.New(t) + text := "-B763/H-SDHIPRWZ/S" + fields := getFields(AircraftRegex, text) + ast.Equal(1, len(fields)) + ast.Equal("B763/H", fields[KeyAircraft]) +} + func TestDofRegex(t *testing.T) { ast := assert.New(t) text := "DOF/120820" @@ -43,6 +51,29 @@ func TestDofRegex(t *testing.T) { ast.Equal(20, d.Day()) } +func TestGetOtherRegex(t *testing.T) { + ast := assert.New(t) + regex := getOtherRegexWithName("p1") + ast.Equal(`-?(?P[A-Z0-9\/ \n\r]+)`, regex) +} + +func TestOthers(t *testing.T) { + ast := assert.New(t) + text := `-N0473F320 NOPIK1B +NOPIK G597 GONAV/N0473F320 G597 AGAVO/K0876S0980 G597 DONVO A326 +ANRAT ANRATA` + fields := getFields(OtherRegex, text) + + ast.Equal(1, len(fields)) + ast.Equal(text[1:], fields["NAME"]) + + text = "-N0473F320 NOPIK1B" + fields = getFields(OtherRegex, text) + + ast.Equal(1, len(fields)) + ast.Equal(text[1:], fields["NAME"]) +} + func TestArrDep(t *testing.T) { ast := assert.New(t) s := `ZCZC TMQ2526 141605 @@ -121,7 +152,7 @@ NNNN ast.Equal(false, tele.Type == "PLN", "Not a plan") ast.Equal("FPL", tele.Type, "Flop type is FPL") ast.Equal("AAR997", tele.FlightNumber, "flight number is AAR997") - ast.Equal("B763/H", tele.Plane, "plane is B763/H") + ast.Equal("B763/H", tele.Aircraft, "aircraft is B763/H") ast.Equal("RKSI", tele.Departure, "departure airport is RKSI") ast.Equal(1, tele.DepartureTime.Hour()) ast.Equal(20, tele.DepartureTime.Minute()) diff --git a/parser/telegram.go b/parser/telegram.go index e404d7a..2349b75 100644 --- a/parser/telegram.go +++ b/parser/telegram.go @@ -17,6 +17,7 @@ type Telegram struct { FlopValue []string FlightNumber string Plane string + Aircraft string RegisterNumber string Departure string DepartureTime time.Time @@ -109,3 +110,7 @@ func parseDof(text string) time.Time { dof, _ := time.Parse("060102", value["time"]) return dof } + +func getOtherRegexWithName(name string) string { + return strings.ReplaceAll(OtherRegex, "NAME", name) +}