必要时使用正则表达式向 csv 文件添加逗号

Posted

技术标签:

【中文标题】必要时使用正则表达式向 csv 文件添加逗号【英文标题】:Adding commas when necessary to a csv file using regex 【发布时间】:2016-08-21 07:26:53 【问题描述】:

我有一个 csv 文件,如下所示:

entity_name,data_field_name,type
Unit,id
Track,id,LONG

第二行缺少逗号。我想知道是否可能有一些类似正则表达式或 awk 的工具,以便将逗号附加到行尾,以防这些行中缺少逗号?

更新

我知道要求有点模糊。可能有几种替代方法可以缩小要求范围,例如:

    标题行应定义对整个文件有效的列数(和逗号)。脚本应首先读取标题行并找出正确的列数。 可以将列数作为参数传递给脚本。 可以将列数硬编码到脚本中。

一开始我并没有缩小要求,因为我对其中任何一个都满意。当然,第一种选择是最好的,但我不确定这是否容易实现。

感谢所有出色的答案和 cmets。下一次,我将明确说明可接受的替代要求。

【问题讨论】:

你用vim标记了Q,你不知道如何在vim的第2行添加逗号?还是还有更多要求? 可以像v/,.*,/norm A,一样简单 编辑您的问题以显示您的尝试和预期输出。可以有 2 个缺少的逗号吗?空行?如果是这样,请更新您的输入以包含这些案例。 @Kent 在问题中,我说“可能有一些正则表达式或类似 awk 的工具”。在这类问题中,有人建议使用其他工具提出非常不同的解决方案是很常见的。 Vim 是一个非常强大的工具。我认为使用 Vim 可能会出现一个有趣的解决方案。 【参考方案1】:

您可以使用此 awk 命令根据标题行中的列数用空单元格值填充从第二行开始的所有行,以避免硬编码列数:

awk 'BEGINFS=OFS="," NR==1nc=NF NF$nc=$nc 1' file

entity_name,data_field_name,type
Unit,id,
Track,id,LONG

较早的解决方案:

awk 'BEGINFS=OFS="," NR==1nc=NF printf "%s", $0;
  for (i=NF+1; i<=nc; i++) printf "%s", OFS; print ""' file

【讨论】:

awk -F, -vOFS=, 'NR==1x=NFNF=x' 也是如此。 实际上我这样做过一次,但从 EdMorton 那里得到了一个警告,即更改 NF 的这一功能不能在所有 awk 版本中移植。 我目前有 gnu awk,但会在几个小时后尝试 BSD awk @123: 刚刚在 OSX 的 awkawk -F, -v OFS=, 'NR==1x=NFNF=x' file 上进行了测试,但没有成功。第二行打印为Unit,id 而不是Unit,id, 很好,感谢您的跟进。我认为awk 'BEGINFS=OFS=","$3=$31 也应该可以工作?【参考方案2】:

这可能就是您所需要的,具体取决于您在问题中未与我们分享的信息:

$ awk -F, 'print $0 (NF<3?FS:"")' file
entity_name,data_field_name,type
Unit,id,
Track,id,LONG

【讨论】:

【参考方案3】:

为了平衡所有 awk 解决方案,以下可能是仅 vim 解决方案

:v/,.*,/norm A,

理由

/,.*,/          searches for 2 comma's in a line
:v              apply a global command on each line NOT matching the search
norm A,         enters normal mode and appends a , to the end of the line        

【讨论】:

【参考方案4】:

与另一个awk

awk -F, 'NF==2$3=""1' OFS=, yourfile.csv

【讨论】:

【参考方案5】:

试试这个:

$ awk -F , 'NF==2$2=$2","1' file

输出:

entity_name,data_field_name,type
Unit,id,
Track,id,LONG

【讨论】:

【参考方案6】:

我会使用 sed,

sed 's/^[^,]*,[^,]*$/&,/' file

例子:

$ echo 'Unit,id' | sed 's/^[^,]*,[^,]*$/&,/'
Unit,id,
$ echo 'Unit,id,bar' | sed 's/^[^,]*,[^,]*$/&,/'
Unit,id,bar

【讨论】:

以上是关于必要时使用正则表达式向 csv 文件添加逗号的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式将引号添加到不带引号的 CSV 列

使用批处理脚本,如何使用正则表达式拆分 .csv 文件中的数据?

逗号和双引号CSV格式的正则表达式拆分[重复]

正则表达式拆分 CSV

Grep 正则表达式未按预期工作

添加逗号时如何更新此 jQuery 插件/正则表达式以忽略小数?