141

我在 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 复制和粘贴部分会很棒。有什么提示吗?

4

13 回答 13

290

如果您使用的是某种 UNIX(Linux 等),您可以通过 column(1) 命令作弊并过滤它。

:%!column -t

以上将解析错误的字符串文字内的分隔符,因此您可能需要预处理步骤并为此文件指定分隔符,例如:

%!sed 's/","/\&/' | column -t -s '&'
于 2009-08-04T21:03:41.093 回答
59

有时我们只想对齐两列。在这种情况下,我们不需要任何插件,可以像这样使用纯 Vim 功能:

  1. 选择一个分隔符。在 OP 的帖子中,这是一个逗号,在我的示例中,这是=.
  2. 在它之前/之后添加空格。我s/=/= ...spaces... /在视觉选择中使用这个。
  3. 找到最长的单词并将光标放在它后面。
  4. dw使用和垂直移动删除所有额外的空格。

该技术的示例如下所示:

例子

我发现自己不需要经常调整东西来安装另一个插件,所以这是我完成它的首选方式——尤其是它不需要太多思考。

于 2015-02-09T16:49:52.737 回答
25

正如 Sunny256 所建议的那样,该column命令是在 Unix/Linux 机器上执行此操作的好方法,但是如果您想在纯 Vim 中执行此操作(以便它也可以在 Windows 中使用),最简单的方法是安装Align插件,然后执行:

:%Align ,
:%s/\(\s\+\),\s/,\1/g

第一行对齐逗号上的条目,第二行移动逗号,使其与前面的值齐平。您也许可以使用AlignCtrl定义一个自定义映射,一次完成所有工作,但我永远不记得如何使用它......

编辑

如果您不介意条目之间有两个空格,并且想在一个命令中执行此操作,您还可以执行以下操作:

:%Align ,\zs
于 2009-08-05T07:18:06.223 回答
10

这是使用 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)
于 2014-06-05T16:42:13.553 回答
9

此外,Tabularize 相当不错http://vimcasts.org/episodes/aligning-text-with-tabular-vim/

于 2014-01-06T16:16:05.773 回答
8

我们现在还拥有由 junegunn 编写的美妙的EasyAlign插件。

README 中的演示 GIF:

于 2017-01-03T16:25:10.377 回答
5

您可以使用csv.vim插件。

:%ArrangeColumn

但是,这不会完全按照您的要求进行:它会正确调整单元格的内容,而您的值会按小数点或第一位数字对齐。

该插件还有许多其他有用的命令来处理 CSV 文件。

于 2014-01-17T17:31:23.633 回答
3

此外,如果您的列很长,禁用默认换行会很方便

:set nowrap
:%!列-t

(请注意,在 debian 中,如果要拆分多个相邻的分隔符,您还有一个列 -n 选项)

于 2013-10-25T13:30:59.047 回答
3

我只是为此目的写了tablign。安装

pip3 install tablign --user

然后只需在 vim 中标记表格并执行

:'<,'>:!tablign

在此处输入图像描述

于 2018-02-12T17:55:55.543 回答
2

这是一个纯 Vim 脚本答案,没有插件,没有宏:

以我的问题解决方案为例可能最清楚。我选择了我想要影响的代码行,然后使用以下命令(回想一下,从可视模式进入命令模式会自动添加“'<,'>”,因此它作用于可视范围):

:'<,'>g``normal / "value<0d>D70|P`

除非我实际上没有输入“<0d>”。您可以在命令行上输入不可打印的字符,方法是按 ctrl-v,然后按您要键入的键。“<0d>”是我输入“ctrl-v enter”后在命令行上呈现的内容。在这里,它被“正常”命令解析为退出“/”搜索模式。然后光标跳转到当前行的“value”。

然后我们只需 [D] 删除该行的其余部分,跳到第 70 列(或您需要的任何内容),然后 [P] 删除我们刚刚删除的内容。这确实意味着我们必须确定最宽线的宽度,直到我们的搜索。如果你没有把这些信息放在你的状态栏中,你可以通过输入普通模式命令'g ctrl-g'来查看光标所在的列。另请注意,跳转到不存在的列需要设置“virtualedit”!

我将 :g(lobal) 命令的搜索词留空,因为我们使用了视觉块并希望影响每一行,但您可以使用视觉选择(以及“'<,'>”)并放置代替那里的搜索词。或者结合视觉选择和搜索词来更精细/更容易地缩小范围。

这是我最近学到的东西:如果你搞砸了一个复杂的命令模式命令,用 'u' 撤消(如果它影响了缓冲区),然后按“q:”进入一个特殊的命令历史缓冲区,它的作用很像传统缓冲区. 编辑任意行并按回车键,更改的命令将作为新命令输入。如果您不想在第一次完美地制定所有内容时感到压力,那么这是必不可少的。

于 2019-06-16T14:50:33.117 回答
1

很老的问题,但我最近利用了一个出色的 vim 插件,它可以即时或事后(根据您的用例需要)启用表格格式化:

https://github.com/dhruvasagar/vim-table-mode

于 2015-10-05T19:27:58.043 回答
0

我制作了一个用 Perl 编写的 cli 工具。

你可以在这里找到它:https ://github.com/bas080/colcise

于 2015-02-06T09:57:28.530 回答
0

我的 .vimrc 中有这个。

command! CSV set nowrap | %s/,/,|/g | %!column -n -t -s "|" 

这会在保持逗号的同时对齐列,稍后可能需要正确阅读。例如,对于 Python Pandas read_csv(..., skipinitialspace=True),感谢 Pandas 家伙的这个聪明的选择,否则在 vim 中%s/,\s\+/,/g。如果你column有选项--output-separator我猜,我没有,我不知道为什么(我的专栏的手册页说 2004,在 ubuntu 18.04 上,不确定 ubuntu 是否会获得新版本)可能会更容易. 无论如何,这对我有用,如果您有任何建议,请发表评论。

于 2020-01-31T02:22:41.667 回答