必要时使用正则表达式向 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 的 awk
和 awk -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 文件添加逗号的主要内容,如果未能解决你的问题,请参考以下文章