使用awk识别通用CSV文件的记录和字段

时间:2017-09-26 08:45:03

标签: csv awk gawk

 

这种情况不常见,但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 th 记录中,$4 = fourthColumn
  • 它5 th 记录,$1是零长度字符串
  • 在6 th 记录中,$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

2 个答案:

答案 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