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

chr*_*ris 2 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
Run Code Online (Sandbox Code Playgroud)

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

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

感谢任何建议!

编辑:样本行像 -

02032011JuniorHospital       932220320M09A228393
03092011MassGeneralHospitals 923392818F09B228182
Run Code Online (Sandbox Code Playgroud)

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

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

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

表示不快

Sve*_*ach 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)
Run Code Online (Sandbox Code Playgroud)

该类的构造函数接受两个参数.该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: {}})
Run Code Online (Sandbox Code Playgroud)

这创建了一些简单的关键函数,从一行中提取不同的字段.在您的应用程序中,关键功能可能会变得更加复杂.您也可以在此处过滤掉键 - 如果键函数返回None,计数器将忽略该行.最后两行构成一个HierarchicCounter具有以下计数层次结构的实例:

diagnosis_major
|-- diagnosis_minor
|   \-- sex
\-- age
Run Code Online (Sandbox Code Playgroud)

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

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