Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何将缺少的报价添加到csv文件_Regex_Bash_Awk - Fatal编程技术网

Regex 如何将缺少的报价添加到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的制作人将在

我从一个客户那里得到了一个格式错误的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
修饰符,否则它只会修复行中第一个缺少的引号。谢谢,这可能会起作用。我有两个潜在的修复方法。我会尝试并报告。很多人感谢你,我会尝试这个。谢谢,我会试试这个。谢谢-我在脚本中使用这个。谢谢-我在脚本中使用这个。