7

Epime 输出一个 .txt 文件,如下所示:

***标题开始***
版本持续:1
级别名称:会话
主题:7
会话:1
随机种子:-1983293234
组:1
显示刷新率:59.654
*** 标题结束 ***
    等级:2
    *** LogFrame 开始 ***
    均值效应偏差:7
    程序:trialProc
    物品编号:7
    偏见1答案:1
    *** LogFrame 结束 ***
    等级:2
    *** LogFrame 开始 ***
    均值效应偏差:2
    程序:trialProc
    物品编号:2
    偏见1答案:0

我想解析它并将其写入 .csv 文件,但删除了许多行。

我尝试创建一个字典,将出现在冒号之前的文本作为键,将出现在冒号之后的文本作为值:

{主题:[7, 7],bias1Answer:[1, 0],itemID:[7, 2]}
def load_data(文件名):
    数据 = {}
    eprime = 打开(文件名,'r')
    对于 eprim 中的行:
        rows = re.sub('\s+', ' ', line).strip().split(':')
        尝试:
            数据[行[0]] += 行[1]
        除了 KeyError:
            数据[行[0]] = 行[1]
    eprime.close()
    返回数据
对于打开的行(文件名,'r'):
    如果':'在行:
        行 = line.strip().split(':')
        fullDict[行[0]] = 行[1]
打印完整字典

下面的两个脚本都会产生垃圾:

{'\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 文件!!:

主题项目ID ...bias1Answer
  7 7 1
  7 2 0
4

4 回答 4

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])
于 2013-06-12T03:36:00.280 回答
0

似乎 Epime 输出是用 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
于 2013-06-12T04:20:25.560 回答
0

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

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

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

以下是我将如何处理这个问题:

  1. 如果您没有可用的 edat 文件,请先使用E-DataAid恢复文件。

  2. 然后假设您有多个参与者,您可以使用E-Merge将完成此任务的所有参与者的所有 edat 文件合并在一起。

  3. 打开合并的文件。根据您在文件中的数量,它可能看起来有点混乱。您可以转到工具->排列列。这将显示所有变量的列表。

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

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

如果您在程序中有许多过程,那么此时您可能会在其中包含仅包含启动信息的行以及NULL您的变量或兴趣所在的位置。您可以通过转到工具->过滤器并创建一个过滤器来消除这些行来解决此问题。

于 2014-01-28T18:50:12.593 回答
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 
于 2013-06-12T03:54:29.793 回答