Извлечение только интересных столбцов из таблицы ASCII

Я ни в коем случае не программист, но я наткнулся на действительно неприятную таблицу ASCII с фиксированной шириной, которая может потребовать, чтобы я стал ею :) (надеюсь, с некоторой помощью от вас, ребята)

Я уже обратился к мистеру Google за советом, и он направил меня в сторону Python. Вот и я совсем запутался :(

Таблица нарушений выглядит следующим образом:

column1 column2 column3 column4 column5 column6 column7 ... columnN
   data    crap    crap    data    crap    crap   data
   data    crap    crap    data    crap    crap   data
   data    crap    crap    data    crap    crap   
   data            crap            crap    crap   
   data    crap    crap    data    crap    crap   data
   data    crap    crap    data    crap    crap   data
   data    crap    crap            crap    crap   data
   data    crap    crap    data    crap           data
   data    crap    crap    data    crap    crap   data
   data    crap    crap    data    crap    crap   data

Как вы можете видеть, количество столбцов может варьироваться, и в таблице есть части, в которых нет данных, а также есть столбцы, в которых есть данные, которые меня не интересуют.

Моя цель - иметь таблицу в конце, которая выглядит так:

column1 column4 column7 ... columnN
   data   data    data
   data   data    data
   data   data       
   data           
   data   data    data
   data   data    data
   data           data
   data   data    data
   data   data    data
   data   data    data

Итак, теперь все столбцы, которые мне не нужны, исчезли. Это в основном моя цель - таблица, в которой есть только интересующие меня столбцы. Как вы думаете, можно ли сделать что-то подобное в Python?


person Mandy Fabrione    schedule 13.07.2012    source источник


Ответы (3)


Похоже, вы пытаетесь прочитать информацию таблицы из текстового файла, а затем переформатировать ее. Некоторая базовая обработка может выглядеть так:

# First read content into an array
# Each item in the array will be a line of the file
with open('filename.txt') as f:
    content = f.readlines()

# Next, parse each line
data = []
for line in content:
    # You might need to split by spaces
    # This takes care of multiple whitespaces, so "data1   data2 data3    data4"
    # Becomes ['data1','data2','data3','data4']
    row = line.split()
    # Or, maybe you will need to split the row up by tabs into an array
    # [] is a list comprehension, strip() will remove extra whitespace
    row = [item.strip() for item in line.split('\t')]
    # Finally, append the row to your data array
    data.append(row)

# Now, print the data back to a file how you'd like
fout = open('output.txt','w')
for row in data:
   # For specific columns
   fout.write('{0} {1} {2} {3}'.format(row[0],row[1],row[7],row[8]))
   # Or, if you just need to remove a couple columns, you might do:
   row.pop(6)
   row.pop(5)
   row.pop(4)
   fout.write(' '.join(row))
person Adam Morris    schedule 13.07.2012
comment
Привет Адам! Я играл с вашим решением, и я думаю, что это отправная точка для меня, чтобы получить мои зубы в Python. Большое спасибо! - person Mandy Fabrione; 13.07.2012
comment
Это удалит пустые столбцы из списка; "data __________ crap __________ crap crap" становится ['data','crap','crap','crap'] без пустых столбцов между ними (символы подчеркивания используются для иллюстрации пробелов в комментариях). - person Martijn Pieters; 13.07.2012
comment
Конечно, и да, если вы не хотите удалять случайные пустые столбцы с помощью split(), используйте классное решение Мартина Питерса для их сохранения на основе фиксированной ширины символа каждого столбца. - person Adam Morris; 13.07.2012

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

>>> row = "   data    crap    crap            crap    crap   data"
>>> width = 8 # Column width
>>> columns = [row[i*width:(i+1)*width].strip() for i in range((len(row)/width)+1)]
>>> columns
['data', 'crap', 'crap', '', 'crap', 'crap', 'data']

Теперь все, что вам нужно сделать, это выбрать столбцы:

>>> columns[0], columns[3], columns[6]
('data', '', 'data')

Я могу представить, что приведенный выше код все еще выглядит для вас тарабарщиной; Я настоятельно рекомендую вам начать читать об обучении программированию. Python — отличный язык для начала, начните с http://wiki.python.org/moin/BeginnersGuide и продвигайтесь дальше!

person Martijn Pieters    schedule 13.07.2012
comment
Большое спасибо Мартейн! Я тоже так попробую. Прямо сейчас у меня голова идет кругом от всего этого нового Python-материала :) - person Mandy Fabrione; 13.07.2012

Хотя я действительно думаю, что вы должны запрограммировать это на python ради изучения python, если все, что вы хотите, это сделать это, попробуйте использовать Excel!

  • читать в таблице (я был бы удивлен, если бы Excel не мог этого понять!)
  • удалите столбцы, которые вам не интересны
  • экспортировать/сохранять с фиксированной шириной
person Daren Thomas    schedule 13.07.2012
comment
Функция Excel «Текст в столбцы» (на вкладке «Данные» в Excel 2007) отлично справится с этой задачей. Вы можете сделать это на Python в качестве учебного опыта, но вам просто нужно сделать это, используя Excel. - person Li-aung Yip; 13.07.2012
comment
Спасибо Дарен, но файл немного великоват для Excel. Возможно, я должен был упомянуть об этом - это огромный файл. Кстати, твое фото в профиле выглядит пугающе :) - person Mandy Fabrione; 13.07.2012