Exibe a parte inteira dos dados A --- B se os filtros complexos corresponderem a [duplicado]

-1

Possivelmente declarado como duplicado.obrigado por aceitar

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....

Exibir ou excluir ou redirecionar todo o ORDER para PEDIR dados da última linha antes do início do novo pedido, se esses filtros satisfizerem, condição 1: SE NOUN: XP e A / A acima A / A estiverem presentes, exclua a ordem ou analise outro arquivo . Condição 2: IF NOUN: AP e Y / Y acima de U / U está lá, exclua a ordem ou parse em outro arquivo. A saída excluída é semelhante a

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

Como isso muitas condições estão lá, vou adicionar condições em meu próprio país, mas estas são algumas condições que eu postei ..... NOTA: As linhas são dinâmicas e ORDER **** (***) pode ser qualquer letra, mas ORDER é constante.

    
por shekhar 28.02.2017 / 16:07

1 resposta

0

Isso pode ser feito dividindo e conquistando o texto. O script Python abaixo faz exatamente isso - ele lê o arquivo linha por linha, coletando todas as linhas relacionadas a um pedido e, em seguida, passa essas informações para a função que analisa cada ordem para determinar se deve ou não ser impressa. Embora seja ligeiramente detalhado, funciona de forma bastante decente, embora sejam efetivamente dois loops aninhados que provavelmente darão o desempenho 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()

O script foi testado com um arquivo de entrada ligeiramente modificado do OP. Como você pode ver abaixo, BURY e ALUIO são ignorados:

$ ./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
    
por Sergiy Kolodyazhnyy 01.03.2017 / 09:17