2012-12-09 3 views
0

Мне дали данные из файла данных (.txt), представляющие данные из эксперимента, из одного инструмента. Вот пример:изменение формата файла csv с разделителями табуляции

141716:test: 1 width: 10distance: 13 time: 1690 x:2036.1222 y:696.022 target:1925-2175 
141718:test: 2 width: 10distance: 29 time: 624 x:1646.027 y:814.01953 target:1525-1775 
141719:test: 3 width: 10distance: 15 time: 688 x:504.4982 y:846.8401 target:375-375 
141721:test: 4 width: 10distance: 22 time: 620 x:696.42004 y:922.6398 target:550-550 
141722:test: 5 width: 10distance: 10 time: 709 x:366.33945 y:950.7717 target:250-250 
141724:test: 6 width: 10distance: 7 time: 602 x:2181.1575 y:641.32117 target:2075-2325 
141725:test: 7 width: 10distance: 8 time: 568 x:2207.414 y:741.3456 target:2050-2300 
141726:test: 8 width: 10distance: 28 time: 490 x:1629.773 y:691.3334 target:1550-1800 
141727:test: 9 width: 10distance: 23 time: 479 x:1811.6924 y:651.8706 target:1675-1925 
141728:test: 10 width: 10distance: 26 time: 491 x:776.4396 y:851.138 target:650-650 

Как и все остальные файлы данных резюме Я трансформированные их в CSV-файлов в соответствии с Convert tab-delimited txt file into a csv file using Python. Как бы я хотел перевернуть вышеуказанные файлы csv в формат, где первая строка - это имя каждого из данных, а последующие строки - это значения данных. У меня около сотни таких, поэтому не хочу делать это вручную.

+0

Это не файл CSV. Мы можем его преобразовать, но формат ужасен. –

+1

Какой желаемый результат? – unutbu

+0

Желаемый результат: метка времени, тест, ширина, расстояние, время, x, y, цель в верхней строке, а затем значения на каждой строке ниже. У меня есть ~ 100 из них, прежде чем я смогу сопоставить данные этих инструментов с данными из других источников. –

ответ

2

Это не CSV. Формат ужасен. Между полями и distance нет разделителя, и некоторые поля имеют пробел после двоеточия :, а другие нет.

Вы должны обработать это с помощью специального кода, а затем записать его в файл CSV:

import re 
import csv 

lineformat = re.compile(
    r'^(?P<count>\d+)[\s:]*' 
    r'test[\s:]*(?P<test>\d+)[\s:]*' 
    r'width[\s:]*(?P<width>\d+)[\s:]*' 
    r'distance[\s:]*(?P<distance>\d+)[\s:]*' 
    r'time[\s:]*(?P<time>\d+)[\s:]*' 
    r'x[\s:]*(?P<x>\d+\.\d+)[\s:]*' 
    r'y[\s:]*(?P<y>\d+\.\d+)[\s:]*' 
    r'target[\s:]*(?P<target>\d+-\d+)[\s:]*' 
) 
fields = ('count', 'test', 'width', 'distance', 'time', 'x', 'y', 'target') 

with open(inputfile) as finput, open(outputfile) as foutput: 
    csvout = csv.DictWriter(foutput, fields=fields) 
    for line in finput: 
     match = lineformat.search(line) 
     if match is not None: 
      csvout.writerow(match.groupdict()) 

Это использует регулярное выражение имени группы, чтобы разобрать строку в словарь, для легкого запись в файл CSV. Я выбрал «count» как имя для первого числового значения в вашем входном файле, не стесняйтесь его изменять (но делайте это как в регулярном выражении , так и вfields кортежа).

+0

Спасибо, вот почему статистики должны быть на совещаниях дизайнеров! –

+0

Привет Martijn, я продолжаю получать TypeError: объект _sre.SRE_Pattern не может быть вызван при запуске этого скрипта: используете ли вы pythin 2.7? Я использую 3.3. –

+0

@TomKealy: нет, просто небольшая ошибка: в ответ отсутствовал вызов '.search()'. :-) –

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