Python解析大型文本文件并捕获多级数据

Python解析大型文本文件并捕获多级数据,python,parsing,Python,Parsing,首先让我道歉,如果我对这一点的描述是完全迟钝的,仍然在学习这一点的大部分飞行 我有几个大型文本文件(.txt)(约600000行)的综合医院信息,我正在用python解析这些信息。我一直在使用默认的dicts(python2.7)来获得pt的一级深度的计数和子计数。诊断。例如,如果希望捕捉心脏病发作,然后根据类型(伪代码)进行区分: 通过这种方式,我可以发现心脏病发作,以及它们是否是我感兴趣的特定事件。一切正常。然而,现在我还想收集患者年龄(以编码范围报告)、性别(M、F、U)和种族等信息(来自

首先让我道歉,如果我对这一点的描述是完全迟钝的,仍然在学习这一点的大部分飞行

我有几个大型文本文件(.txt)(约600000行)的综合医院信息,我正在用python解析这些信息。我一直在使用默认的dicts(python2.7)来获得pt的一级深度的计数和子计数。诊断。例如,如果希望捕捉心脏病发作,然后根据类型(伪代码)进行区分:

通过这种方式,我可以发现心脏病发作,以及它们是否是我感兴趣的特定事件。一切正常。然而,现在我还想收集患者年龄(以编码范围报告)、性别(M、F、U)和种族等信息(来自同一行)。我意识到我的技术不太适合这一点——它的复杂性似乎在快速增长。所以,在我把自己挖得太深之前,有没有其他方法可以解决这个问题

最后,我打算把所有这些文件放到一个实际的数据库中,但这基本上是最后一条信息。我需要为当前的项目,所以我很舒服,只是把它转储到excel和图形它现在

谢谢你的建议

编辑:采样线类似于-

02032011JuniorHospital       932220320M09A228393
03092011MassGeneralHospitals 923392818F09B228182
因此,所有行都是固定长度的,其中[0:8]行始终是日期,等等。有一个单独的文件(字典?)解释了数字的含义-因此,诊断结果大约为410.22,年龄范围为0=0-1岁,1=2-3岁,等等

目标:对于我想要的每个诊断,我还想知道的是,特定的诊断是一个子类型的兴趣(以上代码没有问题),与该诊断相关的不同年龄(即,每个年龄段中有多少人)。我目前有这个输出到一个excel文件(csv),所以我想要各种各样的多列,我可以打印我需要的

再一次,我可以通过创建几个额外的默认dict来解决这些问题——似乎应该有一种更简单的方法将它们组合到一个主对象中


在我看来,你的处境与我在不知道正则表达式存在的情况下处理文本并从中提取数据时的处境相同(参见模块re)


对你想做的事给出准确的答案,我们会帮助你做你想做的事。就个人而言,它将具有正则表达式的强大功能。

如果将每一行放入一个元组,则可以对该元组中的任何字段或字段组合进行排序。提供用于比较元素的自定义比较器函数。e、 g.比较函数将在字段1上排序,然后在字段3上排序。如果字段1是“疾病”,字段3是“年龄”,它将对y年龄进行排序,在每个年龄类别中,您将有一个已排序的疾病列表。很容易适应,可以分成几个部分,例如:疾病,然后是年龄,并在每个疾病之后分割列表


也就是说,如果没有SQL或电子表格,您可能会看到多个DICT。

您可以概括层次计数的概念,以获得更清晰、更易于修改的代码。分层计数器类的一个基本示例是

class HierarchicCounter(object):
    def __init__(self, key, hierarchy):
        self.key = key
        self.hierarchy = hierarchy
        self.counts = defaultdict(int)
        self.subcounters = defaultdict(self._create_subcounters)

    def _create_subcounters(self):
        return {key: HierarchicCounter(key, hierarchy)
                for key, hierarchy in self.hierarchy.iteritems()}

    def count(self, line):
        key = self.key(line)
        if key is None:
            return
        self.counts[key] += 1
        for subcounter in self.subcounters[key].itervalues():
            subcounter.count(line)
此类的构造函数接受两个参数。
key
参数是“key函数”,它告诉计数器应该计数多少。如果一行被馈送到计数器,它将对其应用键功能,并增加与检索到的键对应的计数。
层次结构
参数是将所需子计数器的关键函数映射到其各自层次结构的字典

用法示例:

def diagnosis_major(line):
    return line[0:3]

def diagnosis_minor(line):
    return line[3:5]

def age(line):
    return int(line[5:7])

def sex(line):
    return line[7]

counter = HierarchicCounter(
    diagnosis_major, {diagnosis_minor: {sex: {}}, age: {}})
这将创建几个简单的键函数,从一行中提取不同的字段。在应用程序中,关键函数可能会变得更复杂。您也可以在此处过滤掉键–如果键函数返回
None
,计数器将忽略该行。最后两行构成一个具有以下计数层次结构的
hierarchyAccounter
实例:

diagnosis_major
|-- diagnosis_minor
|   \-- sex
\-- age
因此,计数器统计每个主要诊断的病例数。对于每个主要诊断,它统计与此主要诊断相对应的次要诊断和年龄。每个主要诊断和每个次要诊断都要计算性别


当然,这个例子并不完整。您需要添加一些代码来以某种格式实际输出计数器层次结构中收集的计数——这只是为了让您了解如何以更一般的方式对其进行抽象。

如果您给我们一个关于文件格式的提示,我们可能会给您一个如何解析它的提示。(几行示例数据就好了。)这在很大程度上取决于您想要的输入和输出格式。但是一个成熟的DB-ORM库可能会帮助您。这是一个简单的.txt文件,固定行(所有行长度相同)2。我正在输出到.csv(使用excel)并使用Dictwriter。
第[65:69]行中的“心脏病发作”
总是
为False
——它不合适<代码>[65:69]==“最差类型”的Python语法不正确。如果这实际上应该是
行[65:69]=“最坏的种类”
,那么它总是
错误。这有点令人困惑。是否可以只发布几行示例数据?请参阅编辑。这只是伪代码——例如,一个实际的代码片段——如果第[65:70]行中的'410.2',那么整个逻辑就是我想要的。我无法发布实际的样本数据,但它与我编辑的数据几乎相同(但要长得多)。对不起,这是一种固定长度的格式,所以我可以轻松地执行第[66:67]行并检查类似的值;我想这比正则表达式简单(如果错误,请纠正我)。我会更新我的原始帖子。先生,你已经超越了我。这是我想象中的那种事情,尽管这有点超出了我的想象。谢谢
diagnosis_major
|-- diagnosis_minor
|   \-- sex
\-- age