如何从e-prime输出中提取特定数据(.txt文件)

时间:2013-11-27 15:39:25

标签: python

过去几天学习Python完成数据提取的功能。我没有得到任何地方和希望你们中有一个可爱的人可以提供建议。

我需要提取以下数据:RESP,CRESP,RTTime和RT。

这是一个我必须处理的混乱的例子。

思想?

Level: 4
        *** LogFrame Start ***
        Procedure: ActProcScenarios
        No: 1
        Line1: It is almost time for your town's spring festival.  A friend of yours is
        Line2: on the committee and asks if you would be prepared to help out with the
        Line3: barbecue in the park.  There is a large barn for use if it rains.
        Line4: You hope that on that day it will be
        pfrag: s-n-y
        pword: sunny
        pletter: u
        Quest: Does the town have an autumn festival?
        Correct: {LEFTARROW}
        ScenarioListPract: 1
        Topic: practice
        Subtheme: practice
        ActPracScenarios: 1
        Running: ActPracScenarios
        ActPracScenarios.Cycle: 1
        ActPracScenarios.Sample: 1
        DisplayFragInstr.OnsetDelay: 17
        DisplayFragInstr.OnsetTime: 98031
        DisplayFragInstr.DurationError: -999999
        DisplayFragInstr.RTTime: 103886
        DisplayFragInstr.ACC: 0
        DisplayFragInstr.RT: 5855
        DisplayFragInstr.RESP: {DOWNARROW}
        DisplayFragInstr.CRESP: 
        FragInput.OnsetDelay: 13
        FragInput.OnsetTime: 103899
        FragInput.DurationError: -999999
        FragInput.RTTime: 104998

4 个答案:

答案 0 :(得分:1)

我认为正则表达式在这里是正确的工具,因为\b word boundary anchors可以确保RESP只匹配整个单词RESP,而不仅仅是更长的单词(如CRESP)。

这样的事情应该让你开始:

>>> import re
>>> for line in myfile:
...     match = re.search(r"\b(RT|RTTime|RESP|CRESP): (.*)", line)
...     if match:
...         print("Matched {0} with value {1}".format(match.group(1),
...                                                   match.group(2)))

输出:

Matched RTTime with value 103886
Matched RT with value 5855
Matched RESP with value {DOWNARROW}
Matched CRESP with value
Matched RTTime with value 104998

答案 1 :(得分:1)

首先将其转换为字典,然后根据需要从字典中获取项目

d = {k.strip(): v.strip() for (k, v) in 
                    [line.split(':') for line in s.split('\n') if line.find(':') != -1]}
print (d['DisplayFragInstr.RESP'], d['DisplayFragInstr.CRESP'], 
       d['DisplayFragInstr.RTTime'], d['DisplayFragInstr.RT'])

>>> ('{DOWNARROW}', '', '103886', '5855')

答案 2 :(得分:1)

我认为你可能会让自己比自己更难做事。 E-prime有一个名为.edat的文件格式,专为您描述的目的而设计。 edat文件是另一种格式,它包含与.txt文件相同的信息,但它提供了一种使提取变量更容易的方法。我个人只使用您在此处发布的文本文件类型作为数据存储冗余的一种形式。

如果你这样做是因为你没有软件密钥,那么知道eprime的E-Merge和E-DataAid程序不需要密钥可能会有所帮助。您只需要用于编辑构建文件的密钥。无论谁为您提供.txt文件,都应该有这些程序的安装盘。如果没有,它可以在PST网站上找到(我相信你需要一个序列码来创建一个帐户,但不确定)

Eprime通常创建一个.edat文件,该文件与您发布的文本文件的内容相匹配。有时虽然eprime崩溃你没有得到edat文件并且只有.txt。幸运的是,您可以从.txt文件生成edat文件。

以下是我将如何处理此问题:如果您没有可用的edat文件,请先使用E-DataAid恢复文件。

然后假设您有多个参与者,您可以使用电子合并将所有edat文件合并到一起完成此任务的所有参与者。

打开合并文件。它可能看起来有点乱,取决于你在文件中有多少。您可以使用Go to tools-> Arrange columns这将显示所有变量的列表。调整,以便只在右侧框中显示所需的变量。点击确定。

查看你发布的文件,它在第4级显示,所以我猜这个实验中有很多程序。如果程序中有许多过程,那么此时您可能会在变量或兴趣所在的位置具有启动信息和NULL。您可以通过转到工具来解决此问题 - >过滤并创建过滤器以消除这些行。有时也取决于文件结构,您最终可能会得到相同数据的重复行。你也可以通过过滤解决这个问题。

然后,您可以将此文件导出为csv

答案 3 :(得分:0)

import re
import pprint


def parse_logs(file_name):
    with open(file_name, "r") as f:
        lines = [line.strip() for line in f.readlines()]

    base_regex = r'^.*{0}: (.*)$'
    match_terms = ["RESP", "CRESP", "RTTime", "RT"]

    regexes = {term: base_regex.format(term) for term in match_terms}

    output_list = []
    for line in lines:
        for key, regex in regexes.items():
            match = re.match(regex, line)
            if match:
                match_tuple = (key, match.groups()[0])
                output_list.append(match_tuple)
    return output_list

pprint.pprint(parse_logs("respregex"))

编辑:蒂姆和盖伊的答案都更好。我急着写点什么,错过了两个更优雅的解决方案。