2013-11-27 41 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

相關問題