编辑文本表格文件的有效方法,这样每个单元格都从同一位置开始

时间:2019-02-13 18:56:16

标签: python bash vim

我有一个表格结构的文本文件,每行包含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%的工作的方法。

有人可以建议一种有效的方法吗?

如果有用,示例文件为here

3 个答案:

答案 0 :(得分:3)

这是让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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

您可以使用https://github.com/junegunn/vim-easy-align插件来对齐各种定界符

只需选择行,然后按:

  • <CR>:映射到<Plug>(EasyAlign)
  • <C-P>:实时预览,可选
  • *:对齐所有定界符
  • <C-D>:切换直到左对齐定界符
  • <C-X>\s\@<=\S\+:选择空格后的非空格作为定界符

或使用命令: '<,'>EasyAlign */\s\@<=\S\+/dl