水曜日, 2月 01, 2012

gawkでEXCEL(エンクォート)のCSV処理

※フィールド分け設定は、一番下。

いつの間にか、gawkがgawk4.0.0にバージョンが上がっていた。

EXCELのCSVのフィールド分けがヨサゲにかけるようになった。

"Splitting By Content - The GNU Awk User's Guide"
http://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html

BEGIN {
FPAT = "([^,]+)|(\"[^\"]+\")"
}

{
print "NF = ", NF
for (i = 1; i <= NF; i++) {
   printf("$%d = <%s>\n", i, $i)
}
}


入力:aa,"bb","cc,dd","","""",,"ee"",""ff"
出力:
NF = 7
$1 =
$2 = <"bb">
$3 = <"cc,dd">
$4 = <"">
$5 = <"""">
$6 = <"ee"">
$7 = <""ff">

上のサイトに書いてあるのでは、EXCELのCSVでは少々不具合がでるので、下のように書き直してみた。

BEGIN {
FPAT = "([^,]*)|(\"([^\"]|\"\")+\")"
}

{
print "NF = ", NF
for (i = 1; i <= NF; i++) {
   printf("$%d = <%s>\n", i, $i)
}
print ""
}


入力:aa,"bb","cc,dd","","""",,"ee"",""ff"
出力:
NF = 7
$1 =
$2 = <"bb">
$3 = <"cc,dd">
$4 = <"">
$5 = <"""">
$6 = <>
$7 = <"ee"",""ff">

とりあえずは、動いているかなと

ps.
って、これじゃだめだな。
考え直さないと・・・

FPAT = "(([^,]*)|(\"([^\"]|\"\")*\")) *,?"

こんな感じか?カンマが付くけど・・・

0 件のコメント: