2016-11-10 92 views
0

分离列我这里有一个很奇怪的FILEFORMAT,它使用制表和空格的任何数额单独场(偶数尾随和领导者)。另一个特点是,可以在这些字段中添加空格,然后以CSV方式进行转义。被分隔用制表和空格

一个例子:

0 "some string" 234  23947  123 ""some escaped"string"" 

我尝试用AWK解析这样的列和我将需要具有在阵列中,例如每一个项目

foo[0] -> 0 
foo[1] -> "some string" 
foo[2] -> 234 
foo[3] -> 23947 
foo[4] -> 123 
foo[5] -> ""some escaped"string"" 

这是可能的吗?我读http://web.archive.org/web/20120531065332/http://backreference.org/2010/04/17/csv-parsing-with-awk/其中说,解析csv已经很难了(对于开始它应该足以解析正常的字符串与空格,逃脱的变体是非常罕见的)

之前,我乱了很长时间:有没有什么办法在awk中这样做还是我最好使用其他语言?

+0

你最好将时间花在哄从生产系统中的正确格式的输出; - /(是的,CSV而unix工具有不同的哲学背景。)祝你好运。 – shellter

+0

@shellter哈哈:d这将可能不会发生......这些文件是由一些软件产生只能在Windows上运行,一些半书面文件和我尝试将它们转换成便于阅读的格式...:/开发人员已经表示他不会支持他自己的任何软件,所以唯一的办法就是用我自己的方式来转换文件。我不知道他怎么能读他的产品 – reox

+0

文件快速浏览后,我会说,解决方案应该是有状态的,如果使用正则表达式先行将需要哪些awk不支持。我应该说,它真的很难使用awk做的和别人的代码会在它15分钟... –

回答

1

随着GNU AWK为FPAT:

$ cat tst.awk 
BEGIN { FPAT="\\S+|\"[^\"]+\"|,[^,]+," } 
{ 
    gsub(/@/,"@A") 
    gsub(/,/,"@B") 
    gsub(/""/,",") 
    for (i=1; i<=NF; i++) { 
     gsub(/,/,"\"\"",$i) 
     gsub(/@B/,",",$i) 
     gsub(/@A/,"@",$i) 
     print i, $i 
    } 
} 

$ awk -f tst.awk file 
1 0 
2 "some string" 
3 234 
4 23947 
5 123 
6 ""some escaped"string"" 

要理解那是什么做的,看到https://stackoverflow.com/a/40512703/1745001

+1

不错有人发布了一个测试和证明你的模型与一个相当极端的情况下的Q ;-) – shellter

相关问题