如果文件中包含一组特定的字符串,我该如何提取记录?

如果文件中包含一组特定的字符串,我该如何提取记录?

我正在分析一个包含 hifen 分隔记录的文件。我想根据字符串、 和xyz.txt的存在来提取记录。随后,我需要将它们写入新文件。源文件包含超过 40,000 条记录,如下所示。FADED:100AM:FFGGfaded100.txt

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

    rtuyss A/A 加油加油加油加油加油加油加油 IRE AP QQ Z
订单 xxxxxxx1

国家: 201 NVDS TEMPROR EXTREME

巴士时间:TRASS:12 辅助:12 褪色:100

                      呜呜呜呜呜
                 GG YYYYYOYOOOOOOO POU
ATM 联合 # AM:FF YYYYYOYOOOOOOO POU POU POU POU
--- -------- --- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --- ---

rtuyss A/A 加油加油加油加油加油加油加油 IRE AP QQ Z
订单 xxxxxxx1

国家: 201 NVDS TEMPROR EXTREME

公交车时间:TRASS:12 AIDED:12 FADED:200

                      呜呜呜呜呜
                  ZZ YYYYYOYOOOOOOO POU
ATM 联合 # AM:FF YYYYYOYOOOOOOO POU POU POU POU

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

rtuyss A/A 加油加油加油加油加油加油加油 IRE AP QQ Z
订单 xxxxxxx1

国家: 201 NVDS TEMPROR EXTREME

巴士时间:TRASS:12 辅助:12 褪色:100

                     呜呜呜呜呜
                  IP地址YYYYYOYOOOOOOOPOU
ATM 联合 # AM:FF YYYYYOYOOOOOOO POU POU POU POU

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

答案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
--- --------  --- -- -- -- -- -- -- -- -- -- -- -- -- -- --  --- --- -- --

相关内容