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

时间:2011-06-06 22:01:11

标签: python parsing

首先让我道歉,如果我对此的描述完全被延迟,仍然在动态学习大部分内容。

我有几个大型文本文件(.txt)(~600,000行)的一般医院信息,我正在用python解析。我一直在使用默认的dicts(python2.7)来获取pt一个级别的计数和子计数。诊断。例如,如果想要捕获心脏病发作,然后根据类型(伪代码)区分:

if 'heart attack' in line[65:69]: 
    defaultdict['heart attack'] +=1
    if [65:69] == 'worst kind':
        defaultdict['worst'] += 1
    else: 
        defaultdict['not worst'] +=1

通过这种方式,我会发现心脏病发作,以及它们是否是特定的感兴趣。一切正常。然而,现在我还想收集患者年龄(编码范围内报告),性别(M,F,U)和种族等的信息(来自同一行)。我意识到我的技术是它不太适合这种情况 - 它似乎在迅速增加复杂性。所以,在我深入挖掘自己之前 - 还有另一种方法我应该解决这个问题吗?

最终我计划将所有这些文件都放到一个实际的数据库中,但这基本上是最后一条信息。我需要当前的项目,所以我很乐意将它转储到excel并暂时绘制图形。

欣赏任何建议!

编辑:示例行就像 -

02032011JuniorHospital       932220320M09A228393
03092011MassGeneralHospitals 923392818F09B228182

因此所有行都是固定长度,其中行[0:8]总是日期等。有一个单独的文件(字典?)解释数字的含义 - 所以诊断就像410.22,年龄将在0 = 0-1岁,1 = 2-3岁,等等......

目标:对于我想要的每一个诊断,也想知道是否特定诊断了一个子类型的间隔(上述代码没有问题),与诊断相关的各种年龄(即多少)在每个年龄段)。我目前有这个输出到excel文件(csv),所以我想要各种多列,我可以根据需要绘制。

同样,我可以弄清楚如何做到这一切只是创建一些额外的默认dicts - 它似乎应该有一种更简单的方法将它们组合成一个主要对象!

3 个答案:

答案 0 :(得分:5)

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

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参数是“关键函数”,它告诉计数器它应该计算什么。如果一条线被送到计数器,它会将密钥功能应用于它并增加与检索到的密钥对应的计数。 hierarchy参数是一个字典,它将所需子类的关键函数映射到它们各自的层次结构。

使用示例:

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,计数器将忽略该行。最后两行使HierarchicCounter实例具有以下计数层次结构:

diagnosis_major
|-- diagnosis_minor
|   \-- sex
\-- age

因此,计数器计算每个主要诊断的病例数。对于每个主要诊断,它计算对应于该主要诊断的次要诊断和年龄。每次轻微诊断的每个主要诊断都会计算性别。

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

答案 1 :(得分:2)

如果你将每一行都放入一个元组,你可以对该元组中的任何字段或字段组合进行排序。提供比较元素的自定义比较器功能。例如您的比较func将对字段1和字段3进行排序。如果字段1是疾病且字段3是年龄,则它将按年龄排序,并且在每个年龄类别中,您将具有排序的疾病列表。相当容易适应突破部分例如:疾病然后年龄,并在每次疾病后分开列表。

http://wiki.python.org/moin/HowTo/Sorting/

话虽这么说,如果没有SQL或电子表格,你可能会看到多个dicts。

答案 2 :(得分:0)

在我看来,当我在努力处理文本并从中提取数据而不知道正则表达式的存在时,你处于我所处的相同状态(参见模块re)

确定您想要做的事情,我们会帮助您做您想做的事情。就个人而言,它将具有正则表达式的力量。