2013-06-12 163 views
7

Eprime输出.txt文件是这样的:解析txt文件转换成字典写入csv文件

*** Header Start *** 
VersionPersist: 1 
LevelName: Session 
Subject: 7 
Session: 1 
RandomSeed: -1983293234 
Group: 1 
Display.RefreshRate: 59.654 
*** Header End *** 
    Level: 2 
    *** LogFrame Start *** 
    MeansEffectBias: 7 
    Procedure: trialProc 
    itemID: 7 
    bias1Answer: 1 
    *** LogFrame End *** 
    Level: 2 
    *** LogFrame Start *** 
    MeansEffectBias: 2 
    Procedure: trialProc 
    itemID: 2 
    bias1Answer: 0 

我要分析此,并将其写入到.csv文件,但与多条线路删除。

我尝试创建了冒号作为重点和 之前出现的文本的文本作为值后的字典:

 {subject: [7, 7], bias1Answer : [1, 0], itemID: [7, 2]}
 
def load_data(filename): 
    data = {} 
    eprime = open(filename, 'r') 
    for line in eprime: 
     rows = re.sub('\s+', ' ', line).strip().split(':') 
     try: 
      data[rows[0]] += rows[1] 
     except KeyError: 
      data[rows[0]] = rows[1] 
    eprime.close() 
    return data 
 
for line in open(fileName, 'r'): 
    if ':' in line: 
     row = line.strip().split(':') 
     fullDict[row[0]] = row[1] 
print fullDict 

低于生产垃圾中的脚本都:

 
{'\x00\t\x00M\x00e\x00a\x00n\x00s\x00E\x00f\x00f\x00e\x00c\x00t\x00B\x00i\x00a\x00s\x00': '\x00 \x005\x00\r\x00', '\x00\t\x00B\x00i\x00a\x00s\x002\x00Q\x00.\x00D\x00u\x00r\x00a\x00t\x00i\x00o\x00n\x00E\x00r\x00r\x00o\x00r\x00': '\x00 \x00-\x009\x009\x009\x009\x009\x009\x00\r\x00' 

如果我可以设置字典,我可以把它写入csv看起来像这样的文件!!:

 Subject itemID ... bias1Answer 
    7  7    1 
    7  2    0 

回答

5

您不需要创建字典。

import codecs 
import csv 

with codecs.open('eprime.txt', encoding='utf-16') as f, open('output.csv', 'w') as fout: 
    writer = csv.writer(fout, delimiter='\t') 
    writer.writerow(['Subject', 'itemID', 'bias1Answer']) 
    for line in f: 
     if ':' in line: 
      value = line.split()[-1] 

     if 'Subject:' in line: 
      subject = value 
     elif 'itemID:' in line: 
      itemID = value 
     elif 'bias1Answer:' in line: 
      bias1Answer = value 
      writer.writerow([subject, itemID, bias1Answer]) 
+0

谢谢!这完美的作品! – user2476665

+0

我不知道'编解码器'是一个多么有用的工具! – Akavall

0

你的第二种方法可行,但每个字典键的值应该是一个列表。目前,对于字典中的每个键,您只存储一个值,因此只有最后一个值被存储。您可以修改您的代码,以便每个键的值都是一个列表。 下面的代码将实现相同的:

for line in open(fileName, 'r'): 
    if ':' in line: 
     row = line.strip().split(':') 
     # Use row[0] as a key, initiate its value 
     # to be a list and add row[1] to the list. 
     # In case already a key 'row[0]' 
     # exists append row[1] to the existing value list 
     fullDict.setdefault(row[0],[]).append(row[1]) 
print fullDict 
0

好像Eprime输出编码使用UTF-16 ..

>>> print '\x00\t\x00M\x00e\x00a\x00n\x00s\x00E\x00f\x00f\x00e\x00c\x00t\x00B\x00i\x00a\x00s\x00'.decode('utf-16-be') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/encodings/utf_16_be.py", line 16, in decode 
    return codecs.utf_16_be_decode(input, errors, True) 
UnicodeDecodeError: 'utf16' codec can't decode byte 0x00 in position 32: truncated data 
>>> print '\x00\t\x00M\x00e\x00a\x00n\x00s\x00E\x00f\x00f\x00e\x00c\x00t\x00B\x00i\x00a\x00s\x00'.decode('utf-16-be', 'ignore') 
    MeansEffectBias 
0

我知道这是一个老问题,所以也许你早已解决,但我认为你正在以比所需要的更复杂的方式来解决这个问题。我想我会回应,以防其他人遇到同样的问题并发现此问题。

如果你正在做的事情这种方式,因为你没有一个软件密钥,它可能有助于知道E-合并E-DataAid方案eprime不需要密钥。你只需要编辑构建文件的密钥。无论谁向你提供.txt文件,都应该有这些程序的安装盘。如果没有,它可以在PST网站上使用(我相信你需要一个串行代码来创建一个帐户,但不能确定)

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

这是我将如何处理这一问题:

  1. 如果没有EDAT文件可先用E-DataAid恢复文件。

  2. 然后假设你有多个参与者可以使用E-合并合并所有EDAT的在所有参与者谁完成这一任务文件一起。

  3. 打开合并的文件。它可能看起来有点混乱,取决于你在文件中有多少。你可以去工具 - >编排列。这将显示所有变量的列表。

  4. 调整以便只有所需的变量位于右侧框中。点击确定。

  5. 那么你应该有一些类似于你的最终目标,可以导出为csv。

如果你在程序很多程序可能会在这一点上有刚有启动信息,并在您的变量或感兴趣的是位置NULL线。您可以通过tools-> filter并创建一个过滤器来消除这些行来修复此问题。