如何在Vim中替换双引号之间的“,”

wmomyfyw  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(167)

我有一个CSV文件,数据是这样的:

"asdd","12","good"

字符串
但有些数据是不规范的,如

"name1,name2","34","bad"


如何将','替换为另一个(例如'|'或'-'等)之间的双引号?
附加:文件大小几乎到40 M。

50pmv0ei

50pmv0ei1#

您可以使用我的csv plugin。它提供了许多处理CSV文件的可能性。在您的情况下,您只需使用:NewDelimiter |使|成为新的CSV文件。

kq0g1dla

kq0g1dla2#

如果我正确理解了你的问题,那么下面的命令应该可以解决这个问题。

:%s/\v([^"]),([^"])/\1-\2/g

字符串
它将用-替换所有未被"包围的,
这里假设所有csv数据都用"包围
样品输入:

"name1,name2","34","bad"
"asdd","12","good"
"name1,name2,name3","34","bad"


输出量:

"name1-name2","34","bad"
"asdd","12","good"
"name1-name2-name3","34","bad"

vxqlmq5t

vxqlmq5t3#

试试这条线:

%s/[^"]\zs,\ze[^"]/-/g

字符串
如果你想处理(删除),之前和之后的空格,例如:

"name1,   name2","34","bad"
"asdd","12","good"
"name1,  name2  ,name3","34","bad"


你可以执行:

%s/[^"]\zs\s*,\s*\ze[^"]/-/g


它将把上面的例子变成:

"name1-name2","34","bad"
"asdd","12","good"
"name1-name2-name3","34","bad"

kq4fsx7k

kq4fsx7k4#

命令:

:s/","/"|"/g

字符串
将文档中的每个“,”替换为“|“
这将改变:

"Hello","world","foo,bar"


"Hello"|"world"|"foo,bar"

cczfrluj

cczfrluj5#

如果每一个","都是正则的:

:%s/\(",\{-}"\)\|,/-\1/g

字符串
其次是

:%s/-"/"/g


应该工作
还有:

:%s/\(\<\(",.\{-}"\>\)\@!\k\+\>\),/\1-/g

相关问题