我正在尝试导入包含患者放射学报告的txt文件。每行应该是放射学检查(MRI / CT /等)。原始的txt文件看起来像这样:
Name | MRN | DOB | Type_Imaging | Report_Status | Report_Text
John Doe | 1234 | 01/01/1995 | MRI |Complete | Exam Number: A5678
Report status: final
Type: MRI of brain
-----------
REPORT:
HISTORY: History of meningioma, surveillance
FINDINGS: Again demonstrated is a small left frontal parasaggital meningioma, not interval growth. Evidence of cerebrovascular disease unchanged from prior.
Again demonstrated are post-surgical changes associated with prior craniotomy.
[report_end]
James Smith | 5678 | 05/05/1987 |CT | Complete |Exam Number: A8623
Report status: final
Type: CT of chest
-----------
REPORT:
HISTORY: Admitted patient with new fever, concern for pneumonia
FINDINGS: A CT of the chest demostrates bla bla bla
bla bla bla
[report_end]
当我使用pd.read_csv('filename',sep ='|',header = 0)导入pandas时,我获得的df只有第一行中的报告文本的“考试编号:A5678”。然后,下一行在第一个单元格中具有“Report status:final”,而该行的其余部分具有NaN。第三行以第一个细胞中的“类型:脑部MRI”开始,其余部分以NaN开始。等等。
在读取txt文件时,导入似乎是将我定义的分隔符(“|”)和原始txt中的选项卡作为分隔符。没有'|'在报告的文本中。
有没有办法以将“考试编号:A5678”和“[报告结束]”之间的所有信息折叠到一个单元格(每行中的最后一个单元格)的方式导入此文件。
或者,我正在考虑将其预处理为文本文件,以便以迭代的方式提取所有报告文本,并将它们附加到我最终能够作为列添加到df的列表中。在网上和SO上看,当我需要使用唯一的开头(“考试编号:”)和结束(“[报告结束]”)分隔符时,我找不到这样做的方法。同时找到一种方法让脚本继续读取它停止的文本(而不是仅提取第一个报告文本)。
有什么想法吗?
谢谢! 玛雅
答案 0 :(得分:1)
请注意您的[report_end]
是否一致。您同时提供了[report_end]
和[report end]
。我假设这是一个错字。
假设您的文件名为test.txt
txt = open('test.txt').read()
names, txt_ = txt.split('\n', 1)
names = names.split('|')
pd.DataFrame(
[t.strip().split('|') for t in txt_.split('[report_end]') if t.strip()],
columns=names)
Name MRN DOB Type_Imaging Report_Status Report_Text
0 John Doe 1234 01/01/1995 MRI Complete Exam Number: A5678\nReport status: final\nTyp...
1 James Smith 5678 05/05/1987 CT Complete Exam Number: A8623\nReport status: final\nType...
答案 1 :(得分:0)
我最终做了这个有用的工作:
import re
import pandas as pd
f = open("filename.txt", "r”)
data = f.read().replace("\n", “”)
matches = re.findall("\|Exam Number:(.*?)\[report_end\]", data, re.DOTALL)
df= pd.read_csv("filename.txt", sep="|", parse_dates=[5]).dropna(axis=0, how="any”)