我有这样的数据集在一个CSV文件
1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804, 0.0133687, 0.010329, 0.00163437, 0.00191202, 0.0134425
1.34538754675, 3.3689e-06, 9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504, 0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153
1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657, 0.0017022, 0.000740644, 0.00078635, 0.000730052, 0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669, 0.00230171, 0.00217917
正如你所看到的,数量也不同,错位格式化。 有没有在vim一种能快速正确对齐列,这样的结果是这样的
1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804, 0.0133687, 0.010329, 0.00163437, 0.00191202, 0.0134425
1.34538754675, 3.3689e-06, 9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504,0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153
1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657, 0.0017022, 0.000740644,0.00078635, 0.000730052,0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669,0.00230171, 0.00217917
这将是巨大的,复制和粘贴用CTRL-V部分。 任何提示?
如果你对某种UNIX(Linux等),你可以欺骗,并通过柱(1)命令过滤。
:%!column -t
上述将解析的字符串文字分隔符里面这是错误的,所以你可能会需要预处理步骤,并指定该文件,例如分隔符:
%!sed 's/","/\&/' | column -t -s '&'
有时候,我们要对齐的只是两列。 在这种情况下,我们并不需要任何插件,可以用纯Vim的功能是这样的:
- 选择一个分隔符。 在OP的帖子,这是一个逗号,在我的例子,这是
=
。 - 前添加空格/后。 我用
s/=/= ...spaces... /
在这个视觉选择。 - 找到的最长的单词,并把光标之后。
- 删除全部采用额外的空格
dw
和垂直移动。
这种技术的示例如下所示:
我不觉得自己需要对齐的东西往往足以安装其它插件,所以这是实现它的我的首选方式 - 尤其是它不需要太多的思考。
作为sunny256建议,该column
命令是在Unix / Linux机器这样一个伟大的方式,但如果你想这样做纯粹的Vim(以便它可以在Windows中使用的为好),最简单的方法就是安装对齐插件,然后执行:
:%Align ,
:%s/\(\s\+\),\s/,\1/g
的第一行对齐的逗号的条目和所述第二使得它与先前值齐平移动逗号。 您可以使用AlignCtrl
定义自定义映射,做了一大堆一气呵成,但我永远记得如何使用它?
编辑
如果你不介意的条目之间两个空格,你想这样做的一个命令,你也可以这样做:
:%Align ,\zs
此外,Tabularize相当不错http://vimcasts.org/episodes/aligning-text-with-tabular-vim/
这是使用vim宏的伟大答案: https://stackoverflow.com/a/8363786/59384 -基本上,你开始录制宏,格式化第一列,停止录制然后重复宏的全部剩余线路。
从这个答案复制/粘贴:
qa0f:w100i <Esc>19|dwjq4@a
注意100I后的空单,而<Esc键>的意思是“按逃生” -不要输入“<Esc键>”的字面。
翻译:
qa -- record macro in hotkey a
0 -- go to beginning of line
f: -- go to first : symbol
w -- go to next non-space character after the symbol
100i <Esc> -- insert 100 spaces
19| -- go to 19th column (value 19 figured out manually)
dw -- delete spaces until : symbol
j -- go to next line
q -- stop recording macro
4@a -- run the macro 4 times (for the remaining 4 lines)
你可以使用csv.vim插件。
:%ArrangeColumn
然而,这不会做的正是你问什么:它会正确调整单元格的内容,而你必须小数点或第一个数字排列你的价值观。
该插件具有与CSV文件的工作很多其他有用的命令。
我们现在也有神话般EasyAlign插件,通过junegunn写的。
从它的README示范GIF:
此外,如果你有很长的列它可以方便的禁用默认包装
:set nowrap
:%!column -t
(注Debian中也有列-n如果要拆分多个相邻的分隔符,其进一步的选择)
很老的问题,但我最近availed一个很好的Vim插件,使表格格式无论是在飞行或后 - 事实(如您的使用案例需要)的自己:
https://github.com/dhruvasagar/vim-table-mode
我只写tablign用于这一目的。 与安装
[sudo -H] pip3 install tablign
然后,只需标志着VIM表和做
:'<,'>:!tablign
我写python脚本,可以让用户basicly columize任何类型的文本外还VIM的。 不知道这是否会为Windows或Mac用户的工作。
columnice.py要点
在vim时使用。
:'<,'>!columnice =
这将使用等号作为分隔符。 该分隔符是不是扔掉虽然。
这是一个纯粹的Vim脚本答案,无插件,无宏:
这可能是最清楚我的问题的解决方案作为一个例子开始了。 我选择我想影响的代码行,则使用下面的命令(回想从视觉模式进入命令模式自动预先考虑“‘<’>”,因此它作用在可视范围):
:'<,'>g``normal / "value<0d>D70|P`
除了我没有实际键入“<0D>”。 您可以按CTRL-V进入命令行上不可打印字符,那么关键要输入。 “<0D>”,也就是呈现在命令行后,我输入“CTRL-V进入”。 在这里,它是由“正常”命令,从“/”搜索模式退出解析。 光标然后跳转到当前行的“值”。
接下来,只需[d] elete该行的其余部分,跳到列70(或任何你在你的情况需要)和[P] UT斯达康我们刚才删除。 这并不意味着我们要确定最宽的线的宽度,达到我们的搜索。 如果你还没有把这些信息在你的状态行,你可以进入正常模式命令“G CTRL-G”看到光标的列。 还要注意的是跳转到一个不存在的列需要设置了“virtualedit”!
我离开了搜索词:克(叶形)命令空,因为我们使用的视觉块,想要影响的每一行,但你可以使用可视选择离开过(与“‘',’>”),并把搜索词有代替。 或结合了视觉选择和搜索字词,以更精细/缩小东西很容易。
这里的东西我最近才知道:如果你陷入困境,在复杂的命令模式命令,撤销与“U”(如果它影响到了缓冲区),然后按“Q:”进入其作用就像一个传统的缓冲特殊的命令历史记录缓冲区。 编辑任何行,然后按Enter,更改的命令输入为一个新的命令。 必不可少的,如果你不想在完美的制定都在第一时间有压力。