Как я могу извлечь записи из файла, если они включают определенный набор строк?

Я анализирую файл xyz.txt то, которое содержит hifen, разделило записи. Я хочу извлечь записи на основе присутствия строк FADED:100, AM:FF и GG. Впоследствии, я должен записать им в новый файл, faded100.txt. Исходный файл включает более затем 40 тысяч записей, бывших похожих ниже.

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

    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

--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --
1
задан 27 February 2017 в 10:47

1 ответ

Извлечение записей от текстового файла, если ряд строк может быть найден в записи

Сценарий ниже извлечет записи из Вашего файла, если они удовлетворят условиям, Вы описали в своем вопросе. Если порядок важен, см. мои примечания в том, Если порядок важен.

Так как сценарий читает файл на строку и впоследствии обрабатывает строки на запись, это должно быть довольно быстро на больших файлах.

Сценарий

#!/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

Что сценарий делает точно

  • Сценарий читает запись (загружающийся на строку), сохраняет одновременно рекордным если любая из строк ["FADED: 100", "AM:FF", "GG"] происходит в строке.
  • Если не все три строки происходят в записи, запись удалена из "кэша", следующая запись загружается и так далее

Если порядок важен

Если это важно, в котором порядке (строки, содержащие-), строки появляются в Вашей записи, можно заменить строку:

if len(test) == 3:

:

if test == [0, 2, 1]

где числа относятся к индексам строк в списке checks = ["FADED: 100", "AM:FF", "GG"] (где 0 первая строка),

Как использовать

  1. Скопируйте сценарий в пустой файл, сохраните его как filter_records.py
  2. Запустите скрипт с источником (файл с Вашими текущими записями) и выходной файл как аргументы, например:

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

Результат (на Вашем небольшом примере)

    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
--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --
3
ответ дан 7 December 2019 в 12:35

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

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