Eprime输出一个.txt文件,如下所示:
*** 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
答案 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])
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
我知道这是一个较老的问题,所以也许你早就解决了它,但我认为你正在以比所需更复杂的方式接近它。我想我会回应以防其他人有同样的问题,并发现这一点。
如果你这样做是因为你没有软件密钥,那么知道epold的 E-Merge 和 E-DataAid 程序可能会有所帮助不需要钥匙。您只需要用于编辑构建文件的密钥。无论谁为您提供.txt文件,都应该有这些程序的安装盘。如果没有,它可以在PST网站上找到(我相信你需要一个序列码来创建一个帐户,但不确定)
Eprime通常会创建一个.edat
文件,该文件与您发布的文本文件的内容相匹配。有时候,如果eprime崩溃你没有得到edat文件并且只有.txt
。幸运的是,您可以从.txt
文件生成edat文件。
以下是我将如何处理此问题:
如果您没有可用的edat文件,请先使用 E-DataAid 恢复文件。
然后假设您有多个参与者,您可以使用 E-Merge 将所有edat文件合并到一起完成此任务的所有参与者。
打开合并文件。它可能看起来有点乱,取决于你在文件中有多少。您可以转到工具 - &gt;排列列。这将显示所有变量的列表。
调整以便只在右侧框中显示所需的变量。点击确定。
然后你应该有类似你最终目标的东西,可以作为csv导出。
如果程序中有许多程序,此时您可能会在变量或兴趣所在的位置包含启动信息和NULL
的行。你可以通过转到 tools-&gt;过滤器并创建一个过滤器来消除这些行来解决这个问题。