Regex VIM填充适当数量的“、0”以获取CSV文件

Regex VIM填充适当数量的“、0”以获取CSV文件,regex,csv,search,vim,substitution,Regex,Csv,Search,Vim,Substitution,我有一个包含如下数字的文件 1, 2, 3 4, 5 6, 7, 8, 9,10,11 12,13,14,15,16 ... 我想通过填充每一行来创建一个CSV文件,这样就有6个值被5个逗号分隔,所以我需要在每一行中添加一个适当的数字,0。它看起来应该像 1, 2, 3, 0, 0, 0 4, 5, 0, 0, 0, 0 6, 7, 8, 9,10,11 12,13,14,15,16, 0 ... 我该如何处理VIM 我可以用正则表达式计算一行中的数字,并用“替换”s命令将正确的

我有一个包含如下数字的文件

 1, 2, 3
 4, 5
 6, 7, 8, 9,10,11
12,13,14,15,16
...
我想通过填充每一行来创建一个CSV文件,这样就有6个值被5个逗号分隔,所以我需要在每一行中添加一个适当的数字,0。它看起来应该像

 1, 2, 3, 0, 0, 0
 4, 5, 0, 0, 0, 0
 6, 7, 8, 9,10,11
12,13,14,15,16, 0
...
我该如何处理VIM


我可以用正则表达式计算一行中的数字,并用“替换”s命令将正确的数字0添加到每行吗?

您可以先在所有行中添加六个零,而不管它们有多少个数字,然后,您可以删除从第六个逗号到每行末尾的所有内容

要插入它们

        :1,$ normal! i,0,0,0,0,0,0
从第六个逗号删除到结尾

        :1,$normal! ^6f,D

      ^ moves to first character in line(which is obviously a number here)

       6f,  finds comma six times

        D delete from cursor to end of line 
例如:

原创的

             1,2,
             3,6,7,0,0,0
             4,5,6
            11,12,13
在加上六个零之后

             1,2,0,0,0,0,0,0
             3,6,7,0,0,0,0,0,0,0,0,0
             4,5,6,0,0,0,0,0,0
            11,12,13,0,0,0,0,0,0
从六个逗号移到行尾后

             1,2,0,0,0,0,0
             3,6,7,0,0,0,0
             4,5,6,0,0,0,0
            11,12,13,0,0,0

您可以先在所有行中添加六个零,而不管它们有多少个数字,然后,您可以删除从第六个逗号到每行末尾的所有内容

要插入它们

        :1,$ normal! i,0,0,0,0,0,0
从第六个逗号删除到结尾

        :1,$normal! ^6f,D

      ^ moves to first character in line(which is obviously a number here)

       6f,  finds comma six times

        D delete from cursor to end of line 
例如:

原创的

             1,2,
             3,6,7,0,0,0
             4,5,6
            11,12,13
在加上六个零之后

             1,2,0,0,0,0,0,0
             3,6,7,0,0,0,0,0,0,0,0,0
             4,5,6,0,0,0,0,0,0
            11,12,13,0,0,0,0,0,0
从六个逗号移到行尾后

             1,2,0,0,0,0,0
             3,6,7,0,0,0,0
             4,5,6,0,0,0,0
            11,12,13,0,0,0

您可以通过键入以下命令来实现:

:g/^/ s/^.*$/&,0,0,0,0,0,0/ | normal! 6f,D

您可以通过键入以下命令来实现:

:g/^/ s/^.*$/&,0,0,0,0,0,0/ | normal! 6f,D
使用perl:

使用awk:

使用perl:

使用awk:

至于如何从Vim内部执行此操作,您还可以通过外部程序传递文本,它将用输出替换输入。这是一种利用排序、重复数据消除、基于grep的过滤等或Sato的一些建议的简单方法。因此,如果您有一个名为standardize_commas.py的脚本,请尝试使用可视线模式shift+v选择块,然后选择,然后键入如下内容:!python/tmp/standarding_commas.py。它应该在该字符串前面加一点前缀,指示该命令将在当前选定的行上运行

仅供参考,这是我的/tmp/standarized_commas.py脚本:

import sys

max_width = 0
rows = []
for line in sys.stdin:
    line = line.strip()
    existing_vals = line.split(",")
    rows.append(existing_vals)
    max_width = max(max_width, len(existing_vals))

for row in rows:
    zeros_needed = max_width - len(row)
    full_values = row + ["0"] * zeros_needed
    print ",".join(full_values)
至于如何从Vim内部执行此操作,您还可以通过外部程序传递文本,它将用输出替换输入。这是一种利用排序、重复数据消除、基于grep的过滤等或Sato的一些建议的简单方法。因此,如果您有一个名为standardize_commas.py的脚本,请尝试使用可视线模式shift+v选择块,然后选择,然后键入如下内容:!python/tmp/standarding_commas.py。它应该在该字符串前面加一点前缀,指示该命令将在当前选定的行上运行

仅供参考,这是我的/tmp/standarized_commas.py脚本:

import sys

max_width = 0
rows = []
for line in sys.stdin:
    line = line.strip()
    existing_vals = line.split(",")
    rows.append(existing_vals)
    max_width = max(max_width, len(existing_vals))

for row in rows:
    zeros_needed = max_width - len(row)
    full_values = row + ["0"] * zeros_needed
    print ",".join(full_values)

可以使用选定的行号或标记,而不是1,$。这将是一种比使用复杂正则表达式更简单的方法。作为normal的一种快照形式,您可以使用normal。您可以使用选定的行号或标记,而不是1,$。这将是一种比使用复杂正则表达式更简单的方法。作为normal的一种快照形式,您可以使用normal。可以使用正则表达式并找到逗号的数量,然后在替换部分中使用expr部分,如/\=expr。但有几种方法比正则表达式(如宏或命令)更简单。利用vim。可以使用regex并找到逗号的数目,然后在替换部分中使用expr部分,比如/\=expr。但有几种方法比正则表达式(如宏或命令)更简单。利用vim。