python - 使用 Python 从大型非结构化文本文件中提取数据元素

标签 python parsing text export-to-csv

我正在尝试从大型非结构化文本文件(每个文件 1,000,000 到 15,000,000 行)中提取没有一致分隔符的数据元素。数据元素的顺序是一致的。

Sample data:

  NAME    FIRSTNAME LASTNAME    DATE-OF-BIRTH        01/01/2019   ID-NUMBER  123     
  ADDRESS-1  1234 FAKE STREET                        COUNTY-CODE    123                             
  ADDRESS-2                                                                            
  CITY       NOWHERE                STATE   OH   ZIP  12345                            
RANDOM DATA .... 700+ LINES
  NAME  FIRSTNAME2 LASTNAME2    DATE-OF-BIRTH        01/01/2019   ID-NUMBER 4567    
  ADDRESS-1           123456 OTHER STREET            COUNTY-CODE  45678                                  
  ADDRESS-2                                                                            
  CITY      SOMEWHERE               STATE   MI   ZIP  65432                            
RANDOM DATA .... 700+ LINES

我正在寻找一种方法来创建 CSV 输出,其中包含下面列出的几个字段的值:

NAME, COUNTY-CODE, ZIP
FIRSTNAME LASTNAME, 123, 12345
FIRSTNAME2 LASTNAME2, 45678, 65432 

数据不是制表符分隔的,并且间距会有所不同。任何帮助将不胜感激!

最佳答案

嗯...

我假设您有一堆行,每行都包含对 ID VALUE,并且每个 block 都以 id NAME 开头。

因此,我将使用 re 模块来搜索预期的模式,即 NAME 启动新元素的情况。由于真正的名字和姓氏可以使用多个单词(约翰·菲茨杰拉德·肯尼迪),因此我将“姓名”视为“姓名”和“出生日期”之间的所有内容。

恕我直言,一种简单的方法是在解析行时构建一个字典,并在到达 NAME 时和文件末尾使用 DictWriter 写入字典。如果找到多个关键字,我只会保留第一次出现的每个关键字,但您也可以提出异常(exception)。

代码可能是

import re
import csv

# prepare the patterns to search for
name = re.compile(r"NAME\s+(.*)\s+DATE")
zip_code = re.compile(r"ZIP\s*([0-9]+)")
county_code = re.compile(r"COUNTY-CODE\s*([0-9]+)")

with open("input.txt") as fdin, open("output.csv", newline='') as fdout:
    wr = csv.DictWriter(fdout, fieldnames=['NAME', 'COUNTY-CODE', 'ZIP'])
    elt = {}
    wr.writeheader()
    for line in fdin:
        # process NAME
        mx = name.search(line)
        if mx:
            if elt:                    # write previous dict if any
                wr.writerow(elt)
            elt = {'NAME': mx.group(1).strip()}   # initialize a new dict
        # process other keywords
        if not 'COUNTY-CODE' in elt:              # only keep first one
            mx =  county_code.search(line)
            if mx:
                elt['COUNTY-CODE'] = mx.group(1).strip()   # update the dict with it
        if not 'ZIP' in elt:
            mx = zip_code.search(line)
            if mx:
                elt['ZIP'] = mx.group(1)
    wr.writerow(elt)                                # don't forget last dict

关于python - 使用 Python 从大型非结构化文本文件中提取数据元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54245087/

相关文章:

python - 如何移动绿色字符以在python中使用onkey?

python - 如何正确确保使用共享锁的线程终止?

python - 不知道标题是否存在的 Pandas read_csv

node.js - Node - 解析带有合并单元格的 Excel 文件

java - 如何从文本文件中提取数字

python - Pytorch:如何将 L1 正则化器添加到激活中?

c++ - Boost Spirit Qi解析器不消耗整个字符串表达式?

php - 解析 html 页面

c++ - C++中的简单文本编辑程序

php - 文本框内容添加到 MySQL 数据库,然后显示在 PHP/HTML 文件中