Ich habe in den letzten Tagen Python gelernt, um eine Datenextraktion abzuschließen. Ich komme nicht weiter und hoffe, dass einer von euch lieben Menschen beraten kann.

Ich muss folgende Daten extrahieren: RESP, CRESP, RTTime und RT.

Hier ist ein Ausschnitt für ein Beispiel für das Durcheinander, mit dem ich mich befassen muss.

Gedanken?

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
0
user3042303 27 Nov. 2013 im 19:39

4 Antworten

Beste Antwort

Ich denke, reguläre Ausdrücke wären hier das richtige Werkzeug, da die \b Wortgrenzenanker Sie können sicherstellen, dass RESP nur mit einem ganzen Wort RESP übereinstimmt und nicht nur mit einem Teil eines längeren Wortes (wie CRESP).

So etwas sollte Ihnen den Einstieg erleichtern:

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

Ausgabe:

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
Tim Pietzcker 27 Nov. 2013 im 15:50

Verwandeln Sie es zuerst in ein Diktat und holen Sie sich dann einfach Elemente aus dem Diktat, wie Sie möchten

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')
1
Guy Gavriely 27 Nov. 2013 im 15:57

Ich denke, Sie machen es sich vielleicht schwerer als nötig. E-prime hat ein Dateiformat namens .edat, das für den von Ihnen beschriebenen Zweck entwickelt wurde. Eine edat-Datei ist ein anderes Format, das dieselben Informationen wie die TXT-Datei enthält, aber das Extrahieren von Variablen erleichtert. Ich persönlich verwende den von Ihnen hier veröffentlichten Textdateityp nur als Form der Datenspeicherredundanz.

Wenn Sie dies auf diese Weise tun, weil Sie keinen Softwareschlüssel haben, ist es möglicherweise hilfreich zu wissen, dass für die Programme E-Merge und E-DataAid für eprime kein Schlüssel erforderlich ist. Sie benötigen nur den Schlüssel zum Bearbeiten von Build-Dateien. Wer auch immer Ihnen die TXT-Dateien zur Verfügung gestellt hat, sollte wahrscheinlich eine Installationsdiskette für diese Programme haben. Wenn nicht, ist es auf der PST-Website verfügbar (ich glaube, Sie benötigen einen Seriencode, um ein Konto zu erstellen, aber nicht sicher).

Eprime erstellt im Allgemeinen eine EDAT-Datei, die dem Inhalt der Textdatei entspricht, für die Sie ein Beispiel veröffentlicht haben. Manchmal jedoch, wenn eprime abstürzt, erhalten Sie nicht die edat-Datei und haben nur die .txt. Glücklicherweise können Sie die EDAT-Datei aus der TXT-Datei generieren.

So würde ich dieses Problem angehen: Wenn Sie die EDAT-Dateien nicht zur Verfügung haben, verwenden Sie zuerst E-DataAid, um die Dateien wiederherzustellen.

Angenommen, Sie haben mehrere Teilnehmer, können Sie mithilfe von E-Merge alle Edat-Dateien für alle Teilnehmer zusammenführen, die diese Aufgabe ausgeführt haben.

Öffnen Sie die zusammengeführte Datei. Es könnte ein wenig chaotisch aussehen, je nachdem, wie viel Sie in der Datei haben. Sie können zu Extras-> Spalten anordnen gehen. Dies zeigt eine Liste aller Ihrer Variablen. Stellen Sie so ein, dass sich nur die gewünschten Variablen im rechten Feld befinden. Hit ok.

Wenn Sie sich die Datei ansehen, die Sie gepostet haben, steht oben Level 4, also schätze ich, dass es in diesem Experiment viele Verfahren gibt. Wenn Sie viele Prozeduren im Programm haben, haben Sie an dieser Stelle möglicherweise Zeilen mit Startinformationen und NULL an den Stellen, an denen sich Ihre Variablen oder Interessen befinden. Sie können dies beheben, indem Sie zu tools-> filter gehen und einen Filter erstellen, um diese Zeilen zu entfernen. Manchmal kann es auch je nach Dateistruktur zu doppelten Zeilen derselben Daten kommen. Sie können dies auch durch Filtern beheben.

Sie können diese Datei dann als CSV exportieren

1
Lee 28 Jän. 2014 im 19:14
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"))

Bearbeiten: Die Antworten von Tim und Guy sind beide besser. Ich hatte es eilig, etwas zu schreiben, und verpasste zwei viel elegantere Lösungen.

0
Tim Wilder 27 Nov. 2013 im 15:53