我在 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 功能,如下所示:

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

该技术的示例如下所示:

Example

我发现自己不需要经常调整事物来安装另一个插件,所以这是我完成它的首选方式 - 特别是它不需要太多思考。

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

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

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

编辑

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

:%Align ,\zs

这是使用vim宏的伟大答案: https://stackoverflow.com/a/8363786/59384 - 基本上,在启动录制宏,格式化第一列中,停止记录,然后重复宏对于所有剩余的行。

复制/从答案粘贴:

qa0f:w100i <Esc>19|dwjq4@a

注意100I后的一个空格,而键是指 “按逃逸” - 不键入 “键” 的字面

翻译:

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写入。

这其自述示范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,更改的命令输入为一个新的命令。必不可少的,如果你不想在完美的制定都在第一时间有压力。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top