Regex 如何将缺少的报价添加到csv文件
我从一个客户那里得到了一个格式错误的csv,其中一列缺少一个报价,就像这样Regex 如何将缺少的报价添加到csv文件,regex,bash,awk,Regex,Bash,Awk,我从一个客户那里得到了一个格式错误的csv,其中一列缺少一个报价,就像这样 "ID","Name","Org_ID","TransType","Amount" "1453","John Joe","AZ7629","CREDIT_CARD,"23.44" 请注意信用卡后缺少的报价。它应该读作“信用卡”。 这个缺少的报价损坏了我的处理器。 我需要预处理csv,并在任何缺少它的行上添加此缺少的引号。 有没有办法编写脚本? 此处理在misnight之后运行,手动更新是不可操作的。 csv的制作人将在
"ID","Name","Org_ID","TransType","Amount"
"1453","John Joe","AZ7629","CREDIT_CARD,"23.44"
请注意信用卡后缺少的报价。它应该读作“信用卡”。
这个缺少的报价损坏了我的处理器。
我需要预处理csv,并在任何缺少它的行上添加此缺少的引号。
有没有办法编写脚本?
此处理在misnight之后运行,手动更新是不可操作的。
csv的制作人将在他们这边解决这个问题,但直到6月15日才在时间表上。请帮助。您可以使用
sed
:
sed 's/\([^"]\),/\1",/'
您可以使用
sed
:
sed 's/\([^"]\),/\1",/'
假设每个字段都必须括起来,您可以使用此perl命令行修复缺少的结束引号,该命令行确保在记录结尾之前有偶数个引号(否则它将为每个以逗号结尾的字段添加引号):
perl-pe的/(?假设每个字段都必须括起来,您可以使用此perl命令行修复缺少的结束引号,以确保在记录结束之前有偶数个引号(否则它将为每个字段添加以逗号结尾的引号):
perl-pe的/(?awk
救命!
比sed对应项更长,但可读性更高(在我看来),并且可以使用仪器记录更新的值
$ awk -v RS=[,\n] -v q='"' '!/^"/{b=q} !/"$/{e=q}
{printf "%s", b $0 e RT; b=e=""}' file
将缺少的引号标记化并添加到营救中!
比sed对应项更长,但可读性更高(在我看来),并且可以使用仪器记录更新的值
$ awk -v RS=[,\n] -v q='"' '!/^"/{b=q} !/"$/{e=q}
{printf "%s", b $0 e RT; b=e=""}' file
标记并添加缺少的引号是否总是在信用卡后面,或者每行的字段是否不同?是否可以将”、
(无第二个引号)和,“
(无第一个引号)替换为”,”
?我认为引号和逗号是有效的字段值。实际值各不相同,但它始终是字母字符串。您知道吗,“”字符永远不会出现在引号内?如果缺少两个引号,您怎么知道呢?“a”、“b、c”、“d”是否缺少两个引号(一个在b之后,一个在c之前,所以它应该是a”,“b”,“c”,“d”
)或者没有?你怎么知道的?@AllanL Ed Moton的意思是,要使解决方案起作用,你需要一个花环,即在一个colunm数据中不能存在逗号。没有这个花环,对于一个paticular解决方案,总是会存在一个会破坏它的输入。它总是在信用卡之后,还是每行的字段都不一样?有可能吗将,
(无第二个引号)和,“
(无第一个引号)替换为”,“
?我认为引号和逗号是有效的字段值。实际值各不相同,但始终是字母字符串。您知道吗,”“字符永远不会出现在引号内?如果缺少两个引号,您怎么知道呢?“a”、“b、c”、“d”是否缺少两个引号(一个在b之后,一个在c之前,所以它应该是a”,“b”,“c”,“d”
)或者没有?你怎么知道的?@AllanL Ed Moton的意思是,要使解决方案起作用,你需要一个花环,即在一个colunm数据中不能存在逗号。没有这个花环,对于一个paticular解决方案,总是会存在一个会破坏它的输入。添加g
修饰符,否则它只会修复第一个缺少的引号o行中。谢谢,这可能会起作用。我有两个潜在的修复方法。我会尝试并报告。许多人感谢添加g
修饰符,否则它只会修复行中第一个缺少的引号。谢谢,这可能会起作用。我有两个潜在的修复方法。我会尝试并报告。很多人感谢你,我会尝试这个。谢谢,我会试试这个。谢谢-我在脚本中使用这个。谢谢-我在脚本中使用这个。