这种情况不常见,但valid CSV file有6条记录(5 th 记录为空):
Name(s),Year,CreateDate
Peter,1960,2017-09-26
"Smith, John",,㏹㋈2017
"Kevin ""Kev"" McRae",,,fourthColumn
"Pam,
Sandra
and Kate","
",26.9.2017
是否可以使用awk / gawk正确识别其列和记录,例如
$4
= fourthColumn
$1
是零长度字符串$1
= Pam,↵Sandra↵and Kate
我的问题是如何为每条记录正确获取$1
.. $n
的值?
我能够通过用通用语言编写有限状态机来正确地解析这个文件(我使用的是.NET)。但是有没有一种方法可以使用awk的优势进行正确的解析?
替代方法:如果值Pam,↵Sandra↵and Kate
内的新行是最大的障碍,也许您可以针对上面的示例提出解决方案,其中↵
替换为字符串{{ 1}},即{newline}
将成为Pam,↵Sandra↵and Kate
。我经常这样做是为了预处理,所以这是可以接受的。
修改:根据评论中的要求,这是处理正确识别的字段和记录的示例,其中:
字段分隔符Pam,{newline}Sandra{newline}and Kate
已替换为,
(最好使用awk的;
)
每条记录的最后一列在记录开头重复
输出:
OFS
答案 0 :(得分:1)
我能够通过用通用语言编写有限状态机来正确地解析这个文件(我使用的是.NET)。但是有没有一种方法可以使用awk的优势进行正确的解析?
由于on_update_<resource_name>
是一种完全图灵的完整编程语言,因此您可以在awk中编写解析器。但是没有简单的一行awk技巧来解析这个输入。
我建议坚持使用.NET实现。而且还要查看可用的CSV解析库(适用于任何编程语言,例如Python)。只要您的输入 有效csv,他们就应该能够处理它。
答案 1 :(得分:0)
正如@ hek2mgl所说,处理csv文件的正确方法是使用有限状态机。几年前我用C语写了一篇,直到今天仍然使用它。请参阅https://groups.google.com/d/msg/comp.lang.awk/1aMF1Z3TG7k/-f9wtRQVloYJ。