【发布时间】:2022-01-13 21:10:23
【问题描述】:
情况:我有一个包含各种元素的平面数据文件,我需要提取特定部分。我是 Python 的初学者,使用正则表达式和其他函数将其写出来。这是我收到的 txt 文件中的数据示例:
**ACCESSORID = FS01234** TYPE = USER SIZE = 1024 BYTES
**NAME = JOHN SMITH** FACILITY = TSO
DEPT ACID = D12RGRD DEPARTMENT = TRAINING
DIV ACID = NR DIVISION = NRE
CREATED = 01/17/05 00:00 LAST MOD = 11/16/21 10:42
**PROFILES = VPSNRE P11NR00A**
LAST USED = 12/02/21 09:03 CPU(SYSB) FAC(SUPRSESS) COUNT(06051)
**XA SSN = 123456789** OWNER(JB112)
XA TSOACCT = 123456789 OWNER(JB112 )
XA TSOAUTH = JCL OWNER(JB112 )
XA TSOAUTH = RECOVER OWNER(JB112 )
XA TSOPROC = NR005PROC OWNER(JB112 )
----------- SEGMENT TSO
TRBA = NON-DISPLAY FIELD
TSOCOMMAND =
TSODEFPRFG =
TSOLACCT = 111111111
TSOLPROC = NR9923PROC
TSOLSIZE = 0004096
TSOOPT = MAIL,NONOTICES,NOOIDCARD
TSOUDATA = 0000
TSOUNIT = SYSDD
TUPT = NON-DISPLAY FIELD
----------- SEGMENT USER
**EMAIL ADDR = john.smith@nre.ago.com**
我需要提取的部分以粗体显示。我知道我需要提供到目前为止我所做的并且没有发布我的整个脚本,这是我正在做的提取 ACCESSORID = FS01234 和 NAME = JOHN SMITH部分。
def RemoveSpace():
f = open("PROJECTFILE.txt","r")
f1 = open("RemoveSpace.txt", "w")
data1 = f.read()
word = data1.split()
s = ' '.join(word)
f1.write(s)
print("Data Written Successfully")
RemoveSpace()
f = open(r"C:\Users\user\Desktop\HR\PROJECTFILE\RemoveSpace.txt".format(g), "r").read()
TSS = []
contents = re.split(r"ACCESSORID =",f)
contents.pop(0)
for item in contents:
TSS_DICT = {}
emplid = re.search(r"FS.*", item)
if emplid is not None:
s_emplid = re.search("FS\w*", emplid.group())
else:
s_emplid = None
if s_emplid is not None:
s_emplid = s_emplid.group()
else:
s_emplid = None
TSS_DICT["EMPLOYEE ID"] = s_emplid
name = re.search(r"NAME =.*", item)
if name is not None:
emp_name = re.search("[^NAME = ][^,]*", name.group())
else:
emp_name = None
if emp_name is not None:
emp_name = emp_name.group()
else:
emp_name = None
TSS_DICT["EMPLOYEE NAME"] = emp_name
问题:我很难得到 John Smith。在 John Smith 之后,它不断地将所有内容引入电子邮件地址的最后一行。我的最终目标是获得一个 CSV 文件,其中每个粗体项目作为自己的列。更直接地说,专家将如何使用这种数据清理方法来简化流程?如果需要,我可以发布完整的代码,但不想再把它弄混了。
【问题讨论】:
-
在像
'NAME = JOHN SMITH FACILITY = TSO'这样的部分的情况下,你怎么知道它应该被拆分为'name': 'john smith'和'facility': 'tso'而不是'name': 'john'和'smith facility': 'tso'。Smith之后似乎没有换行符,那你怎么知道分组呢?是否知道所有可能的键?并不是说键都是单个单词,例如XA TSOAUTH。还是您歪曲了数据,我们是否在示例中遗漏了一些特殊字符和换行符? -
@Grismar - 当我在草稿中发布时,它与文本文件一样具有所有空格,但在最后的帖子中,它似乎都彼此相邻。需要的字段是 ACCESSOR ID = xxxxxx NAME = xxxxx xxxxx PROFILES = xxxxxxx XA SSN = xxxxxxxx EMAIL ADDR = xxxxxxxx 如果需要,我可以发布文件的确切外观的屏幕截图。感谢您抽出宝贵时间阅读!
-
每条记录在文本中都需要一个开始和结束。记录中的每个字段都需要一个关键字和一个捕获组值。每场比赛都是一个记录。问题是可变的值。具体来说,某人的姓名和电子邮件地址。但是,任何其他可以有多个部分的字段都是一个潜在的问题。请记住,正则表达式与“人”的眼睛不匹配。
-
谢谢你的好建议!