2016-11-10 7 views
0

ここでは、タブとスペースを区切ってフィールドを区切って(末尾のものや先頭のものまで)使用する、本当に奇妙なファイル形式があります。もう1つの専門分野は、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"" 

これも可能ですか?どのような方法があります:私は長い間の周り混乱する前に私は

(エスケープバリアントは非常にまれである初めのためにスペースを持つ通常の文字列を解析するのに十分なはずです)csvファイルを解析すると、すでに非常に困難であることを述べていたhttp://web.archive.org/web/20120531065332/http://backreference.org/2010/04/17/csv-parsing-with-awk/読みますawkでこれを行うには、他の言語を使うのがよいでしょうか? FPATのためのGNUのawkで

+0

は、あなたの時間をより良いあなたの生産システムから適切にフォーマットされた出力を説得過ごしたことになる見、それはやっているかを理解するには、 - /(はい、CSV UNIXツールにはさまざまな哲学があります)。 – shellter

+0

@shellter haha​​:Dこれはおそらく起こらないでしょう...ファイルはWindows上で実行されるいくつかのソフトウェアによって生成され、半分は書かれた書類があり、やや読みやすいフォーマットに変換しようとしています... /開発者はすでに彼は自分自身以外のソフトウェアをサポートしないと言いました。唯一の方法は、私自身でファイルを変換することです。私は彼がどのように彼の製品のファイルを読むことができるのだろうか – reox

+0

簡単な一見の後、私は解決策がステートフルでなければならないと思うか、Awkがサポートしていない正規表現の先読みが必要になる。私はそのawkと本当に難しいと言わなければならないし、誰かが15分でそれをコード化しようとしている... –

答えて

1

$ 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

niceどちらかというと誰かがあなたのモデルをテストして証明するQを掲載しています;-) – shellter

関連する問題