2013-06-12 47 views
7

Eprime kết quả đầu ra một file .txt như thế này:Phân tích một file txt vào một từ điển để ghi vào tập tin 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 

Tôi muốn phân tích này và viết nó vào một tập tin .csv nhưng với một số dòng đã xóa.

tôi đã cố gắng để tạo ra một từ điển mà mất văn bản xuất hiện trước dấu hai chấm là chìa khóa và văn bản sau khi giá trị:

 {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 

cả các kịch bản bên dưới sản phẩm rác :

 
{'\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' 

Nếu tôi có thể thiết lập từ điển, tôi có thể viết nó vào csv tệp sẽ trông giống như thế này !!:

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

Trả lời

5

Bạn không cần phải tạo từ điển.

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

Cảm ơn! Điều này hoạt động hoàn hảo! – user2476665

+0

Tôi không biết về 'codecs' là một công cụ hữu ích! – Akavall

0

Cách tiếp cận thứ hai của bạn sẽ hoạt động nhưng giá trị cho mỗi từ điển phải là danh sách. Hiện tại cho mỗi khóa trong từ điển bạn chỉ lưu trữ một giá trị như là kết quả của việc chỉ giá trị cuối cùng được lưu trữ. Bạn có thể sửa đổi mã của mình để giá trị cho từng khóa là danh sách. Mã dưới đây sẽ đạt được cùng:

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

Có vẻ như kết quả đầu ra Eprime được mã hóa với 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

Tôi biết đây là một câu hỏi cũ như vậy có lẽ bạn đã từ lâu nó đã giải quyết nhưng Tôi nghĩ rằng bạn đang tiếp cận điều này một cách phức tạp hơn là cần thiết. Tôi hình tôi sẽ trả lời trong trường hợp người khác có cùng một vấn đề và tìm thấy điều này.

Nếu bạn đang làm việc theo cách này bởi vì bạn không có một chìa khóa phần mềm, nó có thể giúp để biết rằng E-MergeE-DataAid chương trình cho eprime không cần chìa khóa. Bạn chỉ cần khóa để chỉnh sửa tệp xây dựng. Bất cứ ai cung cấp cho bạn các tập tin .txt nên có thể có một đĩa cài đặt cho các chương trình này. Nếu không, nó có sẵn trên trang web PST (Tôi tin rằng bạn cần một mã nối tiếp để tạo một tài khoản, nhưng không nhất định)

Eprime thường tạo một tệp .edat khớp với nội dung của tệp văn bản bạn đã đăng ví dụ của. Đôi khi, nếu eprime gặp sự cố, bạn không nhận được tệp edat và chỉ có .txt. May mắn là bạn có thể tạo tệp edat từ tệp .txt.

Đây là cách tôi sẽ tiếp cận vấn đề này:

  1. Nếu bạn không có các tập tin edat sẵn sử dụng đầu tiên E-DataAid để phục hồi các tập tin.

  2. Sau đó giả sử bạn có nhiều người tham gia, bạn có thể sử dụng E-Merge để hợp nhất tất cả các tệp edat với nhau cho tất cả người tham gia đã hoàn thành nhiệm vụ này.

  3. Mở tệp đã hợp nhất. Nó có thể hơi hỗn loạn tùy thuộc vào số lượng bạn có trong tệp. Bạn có thể truy cập Công cụ -> Sắp xếp cột. Điều này sẽ hiển thị danh sách tất cả các biến của bạn.

  4. Điều chỉnh để chỉ các biến mong muốn nằm trong hộp bên phải. Nhấn ok.

  5. Sau đó, bạn nên có một cái gì đó giống như mục tiêu cuối cùng của bạn có thể được xuất dưới dạng csv.

Nếu bạn có nhiều thủ tục trong chương trình bạn có thể vào thời điểm này có những dòng mà chỉ có thông tin khởi động và NULL tại các địa điểm nơi các biến hoặc quan tâm của bạn đang có. Bạn có thể sửa lỗi này bằng cách chuyển đến công cụ -> lọc và tạo bộ lọc để loại bỏ các dòng đó.

Các vấn đề liên quan