2013-11-27 42 views
0

在完成数据提取功能的最后几天,我们一直在学习Python。我没有得到任何地方&希望你们中的一个可爱的人可以建议。如何从电子素数输出(.txt文件)中提取特定数据

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

下面是我必须处理的一个混乱的例子snippit。

想法?

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 
+1

嗨,欢迎来到StackOverflow。我冒着重新格式化你的文章的自由 - 这是否正确?另外,您能否告诉我们您遇到问题的哪个部分?读文件?找到正确的线?在这些方面找到相关的价值观?包含您已有的代码总是很好,所以我们可以显示哪些部件需要工作... –

+0

这是完美的谢谢你,谢谢你的回答! 我了解您提供的代码的功能,但是我在实施时遇到了问题。 我显然必须阅读所需的.txt文件: ep = open('t1.txt。') 然后确定它应该是运行代码并将myfile替换为'ep'的问题。我是否缺少重要的基础知识,因为没有任何反应? 谢谢你的耐心:) – user3042303

+0

你的方法对我来说看起来是正确的。正则表达式相当严格,因为它需要在冒号后面有一个空格字符;如果这不存在(或者可能是一个选项卡),那么正则表达式不匹配。也许在匹配它们之前尝试“打印”这些行,看看这个文件是否真的包含你认为它的内容,并且Python正确地读取它。 –

回答

1

我认为,正则表达式会在这里正确的工具,因为\bword 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

将其转换为一个字典第一,那么就从字典获得的项目,如你所愿

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') 
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")) 

编辑:蒂姆和盖伊的答案都更好。我急于写一些东西,错过了两个更优雅的解决方案。

1

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

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

Eprime通常会创建一个.edat文件,它与您发布的文本文件的内容相匹配的例子。有时候,如果eprime崩溃,你不会得到edat文件,只有.txt。幸运的是,你可以从.txt文件生成edat文件。

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

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

打开合并的文件。它可能看起来有点混乱,取决于你在文件中有多少。您可以转到工具 - >排列列这将显示所有变量的列表。调整以便只有所需的变量位于右侧框中。点击确定。

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

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

相关问题