# # A sample Awk program to read CSV (comma-separated-value) data # with proper handling of quoted commas # 2002-04-07 masudako # BEGIN { comma = "," quote = "\"" blank = " " } # main ... processing a line { len = length($0) inquote = 0 lastpos = 0 kfield = 0 for(k=1; k <= len; k++){ if(substr($0, k, 1) == quote) { inquote = !(inquote) } if( !(inquote) ) { if(substr($0, k, 1) == comma) { str = substr($0, lastpos+1, k-lastpos-1) kfield++ field[ kfield ] = rmquote(trim(str,blank),quote) lastpos = k } } } if(lastpos < len) { str = substr($0, lastpos+1, len-lastpos) kfield++ field[ kfield ] = rmquote(trim(str,blank),quote) } #....... test output nfield = kfield for(kfield=1; kfield <= nfield; kfield++) { printf "%5d:%s:\n", kfield, field[kfield] } } # end of main function rmquote(str,quote) { if( (substr(str,1,1) == quote) && (substr(str,length(str),1) == quote ) ) { return substr(str, 2, length(str)-2) } else { return str } } function trim(str, blank, k, kbegin, kend, lenstr){ lenstr = length(str) for(k=1; k <= lenstr; k++) { if(substr(str, k, 1) != blank) { break } } kbegin = k for(k=lenstr; k >= kbegin; k--) { if(substr(str, k, 1) != blank) { break } } kend = k return substr(str, kbegin, kend-kbegin+1) }