2017-01-27 1 views
2

Мне нужно ввести данные в csv, используя заголовки, и поместить значение, если флаг доступен в противном случае. Обязательный выход:записывать данные в csv в соответствии с именами заголовков, которые указывают на появление элементов

required image В настоящее время я получаю:

getting image

Это мой текущий код, я хотел бы знать, как генерировать нужный мне результат:

входы для кода счетчик1 -4 показано ниже:

OrderedDict([('flags=40', 3971), ('flags=10004', 6244), ('flags=10100', 236), ('flags=90002', 2), ('flags=80', 2009), ('flags=10080', 5421), ('flags=4', 2886), ('flags=100', 227), ('flags=80002', 58), ('flags=10040', 8990), ('flags=0', 5)]) 

OrderedDict([('flags=40', 16), ('flags=10004', 6244), ('flags=10100', 236), ('flags=90002', 2), ('flags=10080', 5421), ('flags=4', 16), ('flags=80002', 11), ('flags=10040', 8990), ('flags=0', 4), ('Total', 20940)]) 
OrderedDict([('flags=4', 1332), ('flags=40', 1839), ('flags=80002', 3), ('flags=100', 197), ('flags=80', 935), ('Total', 4306)]) 
OrderedDict([('Total', 0)]) 
OrderedDict([('flags=40', 2116), ('flags=80', 1074), ('flags=4', 1538), ('flags=100', 30), ('flags=80002', 44), ('flags=0', 1), ('Total', 4803)]) 

dat = 1   
with open(outputcsv,'wb') as outcsv: 
    writer = csv.writer(outcsv,delimiter=',') 
    appname = inputfile[:-3] 
    writer.writerow(appname.split(',')) 
    for x in threads: 
     writer.writerows([x.split(',')]) 
     #w.writeheader([x.split(',')]) 
     if dat == 1: 
      w = csv.DictWriter(outcsv,counter1.keys()) 
      w.writeheader() 
      w.writerow(counter1) 
     elif dat == 2: 
      w = csv.DictWriter(outcsv,counter2.keys()) 
      w.writeheader() 
      w.writerow(counter2) 
     elif dat == 3: 
      w = csv.DictWriter(outcsv,counter3.keys()) 
      w.writeheader() 
      w.writerow(counter3) 
     elif dat == 4: 
      w = csv.DictWriter(outcsv,counter4.keys()) 
      w.writeheader() 
      w.writerow(counter4) 
     dat = dat +1  
     writer.writerows('\n') 

код для того, как нитей читают:

exampleFile = open('top_tasks.csv') 
exampleReader = csv.reader(exampleFile) 
exampleData = list(exampleReader) 
thread1 = exampleData[11][0] 
thread2 = exampleData[12][0] 
thread3 = exampleData[13][0] 
thread4 = exampleData[14][0] 
threads = [thread1,thread2,thread3,thread4] 
+0

Вы должны создать [Minimal, полные и проверяемые] (http://stackoverflow.com/help/mcve). Это облегчает нам помощь. В частности, вы не указали входные данные. –

+0

текст, который я разбираю, является огромным файлом, из которого я извлекаю события с флагами – R2D2

+0

Да, но точка [MCVE] (http://stackoverflow.com/help/mcve) заключается в том, что вы можете получить небольшой пример, который представляет проблему, и позволяет нам и вам тестировать. –

ответ

1

Я думаю, что этот код соответствует вашим требованиям:

from collections import OrderedDict 
import csv 

# build an OrderedDict of all keys 
all_keys = OrderedDict() 

# first column gets name of data set 
all_keys[data_set_name] = data_set_name 

# collect all of the known keys, and insert the thread name 
for counter, thread in zip(counters, threads): 
    all_keys.update(counter) 
    counter[data_set_name] = thread 

with open(outputcsv, 'wb') as outcsv: 
    # using all known keys, create a csv writer 
    w = csv.DictWriter(outcsv, fieldnames=all_keys.keys()) 

    # output the header and data rows 
    w.writeheader() 
    w.writerows(counters) 

данных:

outputcsv = 'output.csv' 
counters = [ 
    OrderedDict(
     [('flags=40', 3971), ('flags=10004', 6244), ('flags=10100', 236), 
     ('flags=90002', 2), ('flags=80', 2009), ('flags=10080', 5421), 
     ('flags=4', 2886), ('flags=100', 227), ('flags=80002', 58), 
     ('flags=10040', 8990), ('flags=0', 5)]), 

    OrderedDict(
     [('flags=40', 16), ('flags=10004', 6244), ('flags=10100', 236), 
     ('flags=90002', 2), ('flags=10080', 5421), ('flags=4', 16), 
     ('flags=80002', 11), ('flags=10040', 8990), ('flags=0', 4), 
     ('Total', 20940)]), 
    OrderedDict([('flags=4', 1332), ('flags=40', 1839), ('flags=80002', 3), 
       ('flags=100', 197), ('flags=80', 935), ('Total', 4306)]), 
    OrderedDict([('Total', 0)]), 
    OrderedDict([('flags=40', 2116), ('flags=80', 1074), ('flags=4', 1538), 
       ('flags=100', 30), ('flags=80002', 44), ('flags=0', 1), 
       ('Total', 4803)]), 
] 

# code assumes thread names are in a list, make some sample names 
threads = ['thread%d' % (i+1) for i in range(len(counters))] 

# first column header if the name of the data set 
data_set_name = 'CandyCrush 1' 
+0

Да, это работает, как и ожидалось, но вопросы остаются, мне нужно помещать имена потоков в каждую строку в качестве индикатора, для которого потоки имеют, какие события флага, вы можете помочь с этим – R2D2

+0

Да, что легко добавить, но только если [данные известны] (http://stackoverflow.com/help/mcve) и связаны с другими исходными данными. –

+0

Изменение названия темы в приложении, имя потока не соответствует – R2D2

Смежные вопросы