Эффективный способ редактирования текстового табличного файла, чтобы каждая ячейка начиналась в одной и той же позиции - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть текстовый файл в виде таблицы, каждая строка содержит от 0 до 4 слов, разделенных на произвольное количество пробелов.

hello     world  this  is
     an   example  file
is   there a   good
way to    clean this
  your help is   
highly      appreciated

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

hello    world        this     is
         an           example  file
is       there        a        good
way      to           clean    this
         your         help     is       
highly   appreciated

Число пробелов является произвольным.Я предпочитаю, чтобы строки, начинающиеся с пробела, пропускали первый элемент, но это не является строгим.

Я считаю, что есть много способов сделать это, мой порядок предпочтений:

  1. В vim с некоторыми хитростями
  2. По команде bash
  3. В текстовом редакторе с такой функциональностью
  4. По языку сценариев (возможно, python)

Поскольку это часть процесса подготовки / проверки данных, мне не нужен идеальный метод;Я все-таки проведу ручную проверку.Я ищу способ, который делает, скажем, от 80 до 90% работы.

Может кто-нибудь предложить эффективный подход?

Если это полезно, файл примера здесь .

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Модуль Python re, .format() предлагает хороший подход к 4..

Ширина столбца основана на длине самой длинной строки без пробелов в вашем файле + column_pad значение.

Вы можете поиграть с column_pad, чтобы изменить фактическую ширину столбца.

Если вы введете rename_file=True, вы получите новый файл с именем 'cleaned_<filename> filename`.В противном случае сценарий заменит исходный файл очищенным файлом.

#!/usr/bin/env python
import re
import sys

def clean_columns(filename, rename_file=False, column_pad=4):
    if rename_file:
        cleaned_filename = 'cleaned_' + filename
    else:
        cleaned_filename = filename

    cleaned_text = ''

    with open(filename, 'r') as dirty_file:
        text = dirty_file.readlines()

    string_list = list(
        {string.strip()
                for line in text
                for string in line.strip().split(' ')})

    max_string_length = len(max(string_list, key=len))
    column_width = max_string_length + column_pad
    formatting_string = '{: <' + str(column_width) + '}'

    for line in text:
        line = re.sub(r'\s+',' ', line).split(' ')
        formatting = formatting_string * len(line)
        line = formatting.format(*line)
        cleaned_text += line + '\n'

    with open(cleaned_filename, 'w') as cleaned:
        cleaned.write(cleaned_text)


clean_columns('sample.txt', rename_file=True, column_pad=8)

Вывод:

hello              world              this               is
                   an                 example            file
is                 there              a                  good
way                to                 clean              this
                   your               help               is
highly             appreciated
0 голосов
/ 14 февраля 2019

Вы можете использовать плагин https://github.com/junegunn/vim-easy-align для выравнивания различных разделителей

Просто выберите линии, нажмите:

  • <CR>: отобразить на <Plug>(EasyAlign)
  • <C-P>: предварительный просмотр в режиме реального времени, необязательно
  • *: выравнивание всех разделителей
  • <C-D>: переключение до ограничителей выравнивания по левому краю
  • <C-X>\s\@<=\S\+: выберите без пробела после пробела в качестве разделителя

или используйте команду: '<,'>EasyAlign */\s\@<=\S\+/dl

0 голосов
/ 13 февраля 2019

Вот способ заставить column соблюдать начальные пробелы: заменить начальный пробел на другой символ

sed 's/^ /_ /' file | column -t | sed 's/^_ /  /'
hello   world        this     is
        an           example  file
is      there        a        good
way     to           clean    this
        your         help     is
highly  appreciated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...