Отображение всего куска данных A---B при совпадении сложных фильтров [дубликат]

Возможно, указано как дубликат. спасибо за принятие

ORDER ALPHA

Facility: 201  ZZZ        COUNTRY
Wrong Trace:       Kotak: NA       Soak: NA        NOUN: XP

                  O  O  O  O  O  O  O  O  O  O  O  O  O  O
                  O  O  O  O  O  O  O  O  O  O  O  O  O  O   LAM
AMO ORDER #   P/P R  O  L  H  S  C  N  D  K  M  D  D  C  N   LAM uii ii oo
--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --

    BZ90rty   K/K AA AA AA NA XP AP NA NA NA NA NA NA AP AP  OOL XP  IP N
a      ZX     A/A WD WD WD NA WD WD NA NA NA NA NA NA WD WD  OOL WD  IP Y
ORDER BURY

Facility: 201  ZZZ        COUNTRY
Wrong Trace:       Kotak: NA       Soak: NA        NOUN: XP

                  O  O  O  O  O  O  O  O  O  O  O  O  O  O
                  O  O  O  O  O  O  O  O  O  O  O  O  O  O   LAM
AMO ORDER #   P/P R  O  L  H  S  C  N  D  K  M  D  D  C  N   LAM uii ii oo
--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --

    BZ903901  A/A AA AA AA NA XP AP NA NA NA NA NA NA AP AP  OOL XP  IP N
a      ZX     A/A WD WD WD NA WD WD NA NA NA NA NA NA WD WD  OOL WD  IP Y

ORDER ALUIO

Facility: 201  ZZZ        COUNTRY
Wrong Trace:       Kotak: NA       PAT: NA        NOUN: AP

                  O  O  O  O  O  O  O  O  O  O  O  O  O  O
                  O  O  O  O  O  O  O  O  O  O  O  O  O  O   LAM
AMO ORDER #   P/P R  O  L  H  S  C  N  D  K  M  D  D  C  N   LAM uii ii oo
--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --

    BZ903901  U/U AA AA AA NA XP AP NA NA NA NA NA NA AP AP  OOL XP  IP N
a      ZX     Y/Y WD WD WD NA WD WD NA NA NA NA NA NA WD WD  OOL WD  IP Y
ORDER AL123  ...cont....

Отобразить или удалить или перенаправить весь ORDER в ORDER данные последней строки перед началом нового заказа, если эти фильтры удовлетворяют, условие 1:IF NOUN :XP и A/A выше A/A присутствует удалить этот заказ или разобрать в другой файл. Условие 2:IF NOUN :AP и Y/Y выше U/U есть удалить этот ордер или разобрать в другой файл.Удаленный выход выглядит как

ORDER ALPHA
Facility: 201  ZZZ        COUNTRY
Wrong Trace:       Kotak: NA       Soak: NA        NOUN: XP

                  O  O  O  O  O  O  O  O  O  O  O  O  O  O
                  O  O  O  O  O  O  O  O  O  O  O  O  O  O   LAM
AMO ORDER #   P/P R  O  L  H  S  C  N  D  K  M  D  D  C  N   LAM uii ii oo
--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --

    BZ90rty   K/K AA AA AA NA XP AP NA NA NA NA NA NA AP AP  OOL XP  IP N
a      ZX     A/A WD WD WD NA WD WD NA NA NA NA NA NA WD WD  OOL WD  IP Y

Как это много условий есть я буду добавлять условия на свой собственный, но это некоторые условия я разместил...... ПРИМЕЧАНИЕ:Строки динамические и ORDER **** (***)может быть любой буквой, но ORDER постоянный.

-1
задан 28 February 2017 в 08:18

1 ответ

Это может быть сделано путем деления и завоевания текста. Сценарий Python ниже делает точно, что - он читает файл линию за линией, собирая все строки, связанные с порядком, и затем передает ту информацию функции, которая анализирует каждый порядок определить, должен ли он быть распечатан. В то время как немного подробный, это работает справедливо прилично, хотя это - эффективно два вложенные циклы, которые, вероятно, дадут O (n^2) производительность.

#!/usr/bin/env python
import sys
def parse_order(order,order_lines):
    flag1 = False
    flag2 = False
    xp_counter = 0
    ap_counter = 0
    for line in order_lines:
        if 'Wrong Trace:' in line:
            words = line.split()
            if 'NOUN:' in words[-2] and 'XP' in words[-1]:
                flag1 = True
                continue
            if 'NOUN:' in words[-2] and 'AP' in words[-1]:
                flag2 = True
                continue
        if flag1 and 'A/A' in line: xp_counter += 1
        if flag2 and ( 'Y/Y' in line or 'U/U' in line):  
            ap_counter += 1
    if xp_counter == 2 or ap_counter == 2:
        return
    print("".join([order]+order_lines)) 

def main():
    buffer=[]
    last_order = None
    with open(sys.argv[1]) as fp:
        for line in fp:
            if line.startswith('ORDER'):
               current_order = line
               if not last_order:
                   last_order = current_order
                   continue
               parse_order(last_order,buffer)
               last_order = current_order
               buffer = []
               continue
            buffer.append(line)
        parse_order(last_order,buffer) 

if __name__ == '__main__': main()

Сценарий был протестирован с немного измененным входным файлом от OP. Поскольку Вы видите ниже, BURY и ALUIO пропускаются:

$ ./parse_orders.py input.txt                                                             
ORDER ALPHA

Facility: 201  ZZZ        COUNTRY
Wrong Trace:       Kotak: NA       Soak: NA        NOUN: XP

                  O  O  O  O  O  O  O  O  O  O  O  O  O  O
                  O  O  O  O  O  O  O  O  O  O  O  O  O  O   LAM
AMO ORDER #   P/P R  O  L  H  S  C  N  D  K  M  D  D  C  N   LAM uii ii oo
--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --

    BZ90rty   K/K AA AA AA NA XP AP NA NA NA NA NA NA AP AP  OOL XP  IP N
a      ZX     A/A WD WD WD NA WD WD NA NA NA NA NA NA WD WD  OOL WD  IP Y

ORDER GAMMA

Facility: 201  ZZZ        COUNTRY
Wrong Trace:       Kotak: NA       Soak: NA        NOUN: XP

                  O  O  O  O  O  O  O  O  O  O  O  O  O  O
                  O  O  O  O  O  O  O  O  O  O  O  O  O  O   LAM
AMO ORDER #   P/P R  O  L  H  S  C  N  D  K  M  D  D  C  N   LAM uii ii oo
--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --

    BZ90rty   K/K AA AA AA NA XP AP NA NA NA NA NA NA AP AP  OOL XP  IP N
a      ZX     A/A WD WD WD NA WD WD NA NA NA NA NA NA WD WD  OOL WD  IP Y
0
ответ дан 3 November 2019 в 16:45

Другие вопросы по тегам:

Похожие вопросы: