Como posso extrair registros de um arquivo se eles incluem um conjunto específico de strings?

1

Estou analisando um arquivo xyz.txt que contém registros separados por hifen. Desejo extrair registros com base na presença das sequências FADED:100 , AM:FF e GG . Posteriormente, preciso escrevê-los para um novo arquivo, faded100.txt . O arquivo de origem inclui mais de 40 mil registros, como abaixo.

--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --

    rtuyss  A/A go go go go go go go go go go go go go go  IRE AP  QQ Z
ORDER xxxxxxx1

country: 201  NVDS        TEMPROR   EXTREME

BUS TIME:       TRASS: 12       AIDED: 12        FADED: 100

                      U  U  U  u  U  A  U  O  O  O  O  O  O  O
                 GG   Y  Y  Y  Y  Y  O  Y  O  O  O  O  O  O  O   POU
ATM UNITED #  AM:FF   Y  Y  Y  Y  Y  O  Y  O  O  O  O  O  O  O   POU POU POU POU
--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --

rtuyss  A/A go go go go go go go go go go go go go go  IRE AP  QQ Z
ORDER xxxxxxx1

country: 201  NVDS        TEMPROR   EXTREME

BUS TIME:       TRASS: 12       AIDED: 12        FADED: 200

                      U  U  U  u  U  A  U  O  O  O  O  O  O  O
                  ZZ  Y  Y  Y  Y  Y  O  Y  O  O  O  O  O  O  O   POU
ATM UNITED #   AM:FF  Y  Y  Y  Y  Y  O  Y  O  O  O  O  O  O  O   POU POU POU POU

--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --

rtuyss  A/A go go go go go go go go go go go go go go  IRE AP  QQ Z
ORDER xxxxxxx1

country: 201  NVDS        TEMPROR   EXTREME

BUS TIME:       TRASS: 12       AIDED: 12        FADED: 100

                     U  U  U  u  U  A  U  O  O  O  O  O  O  O
                  IP Y  Y  Y  Y  Y  O  Y  O  O  O  O  O  O  O   POU
ATM UNITED #   AM:FF Y  Y  Y  Y  Y  O  Y  O  O  O  O  O  O  O   POU POU POU POU

--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --
    
por shekhar 24.02.2017 / 11:23

1 resposta

3

Extrair registros de um arquivo de texto, se um conjunto de strings puder ser encontrado no registro

O script abaixo extrairá registros do seu arquivo, se eles atenderem às condições que você descreveu na sua pergunta. Se a ordem for importante, consulte minhas anotações em Se o pedido for importante .

Como o script lê o arquivo por linha e subsequentemente processa as linhas por registro , ele deve ser bem rápido em arquivos grandes.

O script

#!/usr/bin/env python3
import sys

#--- set the strings to be (needed to be) found below
checks = ["FADED: 100", "AM:FF", "GG"]
#---

f = sys.argv[1]; out = sys.argv[2]; rec = []; test = []

with open(f) as src, open(out, "a+") as targ:
    for l in src:
        rec.append(l)
        if l.startswith("---"):
            if len(test) == 3:
                for l in rec:
                    targ.write(l)
            rec = []; test = []
        else:           
            for s in checks:
                if s in l:
                    test.append(checks.index(s))
                    break

O que o script faz exatamente

  • O script lê um registro (carregamento por linha), mantém ao mesmo tempo registro se alguma das strings ["FADED: 100", "AM:FF", "GG"] ocorrer na linha.
  • Se nem todas as três cadeias ocorrerem no registro, o registro será excluído de "cache", o próximo registro será carregado e assim por diante

Se o pedido for importante

Se for importante em que ordem (linhas contendo-) as strings aparecem dentro do seu registro, você pode substituir a linha:

if len(test) == 3:

por:

if test == [0, 2, 1]

onde os números se referem aos índices das strings na lista checks = ["FADED: 100", "AM:FF", "GG"] (onde 0 é a primeira string)

Como usar

  1. Copie o script em um arquivo vazio, salve-o como filter_records.py
  2. Execute o script com a origem (arquivo com seus registros atuais) e o arquivo de saída como argumentos, por exemplo:

    python3 /path/to/filter_records.py /path/to/inputfile.txt /path/to/outputfile.txt 
    

O resultado (no seu pequeno exemplo)

    rtuyss  A/A go go go go go go go go go go go go go go  IRE AP  QQ Z
ORDER xxxxxxx1

country: 201  NVDS        TEMPROR   EXTREME

BUS TIME:       TRASS: 12       AIDED: 12        FADED: 100

                      U  U  U  u  U  A  U  O  O  O  O  O  O  O
                 GG   Y  Y  Y  Y  Y  O  Y  O  O  O  O  O  O  O   POU
ATM UNITED #  AM:FF   Y  Y  Y  Y  Y  O  Y  O  O  O  O  O  O  O   POU POU POU POU
--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --
    
por Jacob Vlijm 24.02.2017 / 16:25