我有一个表格结构的文本文件,每行包含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
空格数是任意的。我希望以空格开头的行跳过第一个元素,但这并不严格。
我相信有很多方法可以做到这一点,我的偏好顺序是:
由于这是数据准备/验证过程的一部分,所以我不需要完美的方法;毕竟,我将进行手动检查。我正在寻找一种可以完成80%至90%的工作的方法。
有人可以建议一种有效的方法吗?
如果有用,示例文件为here。
答案 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