BEGIN { while (getline str > 0) printfields(str) }
function printfields(str) {
for (k=1; k<=csvsplit(str,arr); k++)
print k, arr[k] }
function csvsplit(str, arr, i,j,n,s,fs,qt) {
# split comma-separated fields into arr
# return number of fields in arr
# in Europe, change fs from "," to ";"
# fields surrounded by double-quotes may
# contain commas; doubled double-quotes
# represent a single embedded quote
delete arr
s = "START"; n = 0; fs = ","; qt = "\""
for (i = 1; i <= length(str); i++) {
if (s == "START") {
if (substr(str,i,1) == fs) {
arr[++n] = "" }
else if (substr(str,i,1) == qt) {
j = i+1; s = "INQUOTES" }
else { j = i; s = "INFIELD" } }
else if (s == "INFIELD") {
if (substr(str,i,1) == fs) {
arr[++n] = substr(str,j,i-j)
j = 0; s = "START" } }
else if (s == "INQUOTES") {
if (substr(str,i,1) == qt) {
s = "MAYBEDOUBLE" } }
else if (s == "MAYBEDOUBLE") {
if (substr(str,i,1) == fs) {
arr[++n] = substr(str,j,i-j-1)
gsub(qt qt, qt, arr[n])
j = 0; s = "START" } } }
if (s == "INFIELD" || s == "INQUOTES") {
arr[++n] = substr(str,j) }
else if (s == "MAYBEDOUBLE") {
arr[++n] = substr(str,j,length(str)-j)
gsub(qt qt, qt, arr[n]) }
else if (s == "START") { arr[++n] = "" }
return n }
QkVHSU4geyB3aGlsZSAoZ2V0bGluZSBzdHIgPiAwKSBwcmludGZpZWxkcyhzdHIpIH0KCmZ1bmN0aW9uIHByaW50ZmllbGRzKHN0cikgewogICAgZm9yIChrPTE7IGs8PWNzdnNwbGl0KHN0cixhcnIpOyBrKyspCiAgICAgICAgcHJpbnQgaywgYXJyW2tdIH0KCmZ1bmN0aW9uIGNzdnNwbGl0KHN0ciwgYXJyLCAgICAgaSxqLG4scyxmcyxxdCkgewogICAgIyBzcGxpdCBjb21tYS1zZXBhcmF0ZWQgZmllbGRzIGludG8gYXJyCiAgICAjIHJldHVybiBudW1iZXIgb2YgZmllbGRzIGluIGFycgogICAgIyBpbiBFdXJvcGUsIGNoYW5nZSBmcyBmcm9tICIsIiB0byAiOyIKICAgICMgZmllbGRzIHN1cnJvdW5kZWQgYnkgZG91YmxlLXF1b3RlcyBtYXkKICAgICMgICBjb250YWluIGNvbW1hczsgZG91YmxlZCBkb3VibGUtcXVvdGVzCiAgICAjICAgcmVwcmVzZW50IGEgc2luZ2xlIGVtYmVkZGVkIHF1b3RlCiAgICBkZWxldGUgYXJyCiAgICBzID0gIlNUQVJUIjsgbiA9IDA7IGZzID0gIiwiOyBxdCA9ICJcIiIKICAgIGZvciAoaSA9IDE7IGkgPD0gbGVuZ3RoKHN0cik7IGkrKykgewogICAgICAgIGlmIChzID09ICJTVEFSVCIpIHsKICAgICAgICAgICAgaWYgKHN1YnN0cihzdHIsaSwxKSA9PSBmcykgewogICAgICAgICAgICAgICAgYXJyWysrbl0gPSAiIiB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN1YnN0cihzdHIsaSwxKSA9PSBxdCkgewogICAgICAgICAgICAgICAgaiA9IGkrMTsgcyA9ICJJTlFVT1RFUyIgfQogICAgICAgICAgICBlbHNlIHsgaiA9IGk7IHMgPSAiSU5GSUVMRCIgfSB9CiAgICAgICAgZWxzZSBpZiAocyA9PSAiSU5GSUVMRCIpIHsKICAgICAgICAgICAgaWYgKHN1YnN0cihzdHIsaSwxKSA9PSBmcykgewogICAgICAgICAgICAgICAgYXJyWysrbl0gPSBzdWJzdHIoc3RyLGosaS1qKQogICAgICAgICAgICAgICAgaiA9IDA7IHMgPSAiU1RBUlQiIH0gfQogICAgICAgIGVsc2UgaWYgKHMgPT0gIklOUVVPVEVTIikgewogICAgICAgICAgICBpZiAoc3Vic3RyKHN0cixpLDEpID09IHF0KSB7CiAgICAgICAgICAgICAgICBzID0gIk1BWUJFRE9VQkxFIiB9IH0KICAgICAgICBlbHNlIGlmIChzID09ICJNQVlCRURPVUJMRSIpIHsKICAgICAgICAgICAgaWYgKHN1YnN0cihzdHIsaSwxKSA9PSBmcykgewogICAgICAgICAgICAgICAgYXJyWysrbl0gPSBzdWJzdHIoc3RyLGosaS1qLTEpCiAgICAgICAgICAgICAgICBnc3ViKHF0IHF0LCBxdCwgYXJyW25dKQogICAgICAgICAgICAgICAgaiA9IDA7IHMgPSAiU1RBUlQiIH0gfSB9CiAgICBpZiAocyA9PSAiSU5GSUVMRCIgfHwgcyA9PSAiSU5RVU9URVMiKSB7CiAgICAgICAgYXJyWysrbl0gPSBzdWJzdHIoc3RyLGopIH0KICAgIGVsc2UgaWYgKHMgPT0gIk1BWUJFRE9VQkxFIikgewogICAgICAgIGFyclsrK25dID0gc3Vic3RyKHN0cixqLGxlbmd0aChzdHIpLWopCiAgICAgICAgZ3N1YihxdCBxdCwgcXQsIGFycltuXSkgfQogICAgZWxzZSBpZiAocyA9PSAiU1RBUlQiKSB7IGFyclsrK25dID0gIiIgfQogICAgcmV0dXJuIG4gfQ==