#! /bin/sh # # This AWK script converts an ARGIS GINA file to PostGres # awk ' BEGIN { printf "create all_geo (" printf "feat_num=int4" printf ") \\g\n" printf "create all_points (" printf "geo_loc= point" printf ") inherits (all_geo) \\g\n" printf "create all_plines (" printf "geo_bbox= box, geo_pline= path" printf ") inherits (all_geo) \\g\n" } /^table/ { first_field= 1 printf "\ncreate " $2 "(" if (!indirect) printf "feat_num=int4, " cur_table= $2 first_attr= 1 } /^field/ { if (! first_field) { printf ", " cur_attrs= cur_attrs "," $2 cur_types= cur_types "," $3 } else { cur_attrs= $2 cur_types= $3 first_field= 0 } printf $2 "=" if ($3 == "CHAR") printf "text" else if ($3 == "NUMBER") { if ($5 == 0) { if ($4 <= 4) printf "int2" else printf "int4" } else printf "float4" } else if ($3 == "DATE") printf "abstime" } /^fc/ { fcode= substr($2, 2, length($2) - 2) fcodes[fcode]= cur_table tab_attrs[cur_table]= cur_attrs tab_types[cur_table]= cur_types printf ") \\g\n" } /^(feat|attr|udb)/ { if (cur_coor != "") { if (must_append) printf "append f_" last_feat "(feat_num= " last_fnum printf ", " sat "=" if (sat == "geo_loc") { printf "\"(" cur_coor ")\"" } else { nc= split(cur_coor, cca, ",") printf "\"(0," nc/2 ",%s)\", ", cur_coor xmin= 1e20; xmax= -1e20; ymin= xmin; ymax= xmax for (i= 1; i <= nc; i+= 2) { if (cca[i] < xmin) xmin= cca[i] if (cca[i] > xmax) xmax= cca[i] if (cca[i+1] < ymin) ymin= cca[i+1] if (cca[i+1] > ymax) ymax= cca[i+1] } printf "geo_bbox=\"(%f,%f,%f,%f)\"", xmin, ymin, xmax, ymax } printf ") \\g\n" cur_coor= "" } } /^feat/ { if ($6 == "p" || $6 == "n") { sat= "geo_loc" } else if ($6 == "l") { sat= "geo_pline" } else sat= "unknown" if (! created_fc[$3]) { created_fc[$3]= 1; printf "\ncreate f_" $3 " () inherits (" if ($6 == "p" || $6 == "n") { printf "all_points" } else if ($6 == "l") { printf "all_plines" } else printf "unknown" printf ") \\g\n" } last_feat= $3 last_fnum= $2 must_append= 1 cur_coor= "" } /^text/ { if (! has_text[last_feat]) { has_text[last_feat]= 1 printf "addattr (label= text) to f_" printf last_feat "\\g\n" } must_append= 0 printf "append f_" last_feat "(feat_num= " last_fnum the_label= substr($0, index($0, " ")+1) printf ", label= " the_label } /^coor / { if (cur_coor == "") { cur_coor= $2 ccstart= 3 } else ccstart= 2 for (i= ccstart; i <= NF; i++) cur_coor= cur_coor "," $i } /^attr/ { if (indirect) { tab_attrs[cur_table]= cur_attrs tab_types[cur_table]= cur_types if (first_attr) { printf ") \\g\n\n" first_attr= 0 } printf "append " cur_table "(" the_attr= tab_attrs[cur_table] } else { printf "append " fcodes[last_feat] "(feat_num= " printf last_fnum ", " the_attr= tab_attrs[fcodes[last_feat]] } tna= split(the_attr, ta, ",") split(tab_types[cur_table], typea, ",") attrs_sub= substr($0, index($0, " ")+1) split(attrs_sub, aa, ",") for (i= 1; i <= tna; i++) { printf ta[i] "=" if (typea[i] != "DATE") printf aa[i] else { aa[i]= substr(aa[i], 2, length(aa[i])-2) split(aa[i], datea) if (datea[2] ~ /[a-zA-Z]/) # Month second field ? monthf= 2 else monthf= 1 monthval= datea[monthf] if (monthval ~ /[jJ][aA][nN]/) monthval= "Jan" else if (monthval ~ /[fF][eE][bB]/) monthval= "Feb" else if (monthval ~ /[mM][aA][rR]/) monthval= "Mar" else if (monthval ~ /[aA][pP][rR]/) monthval= "Apr" else if (monthval ~ /[mM][aA][yY]/) monthval= "May" else if (monthval ~ /[jJ][uU][nN]/) monthval= "Jun" else if (monthval ~ /[jJ][uU][lL]/) monthval= "Jul" else if (monthval ~ /[aA][uU][gG]/) monthval= "Aug" else if (monthval ~ /[sS][eE][pP]/) monthval= "Sep" else if (monthval ~ /[oO][cC][tT]/) monthval= "Oct" else if (monthval ~ /[nN][oO][vV]/) monthval= "Nov" else if (monthval ~ /[dD][eE][cC]/) monthval= "Dec" if (monthf == 2) printf "\"" monthval " " datea[1] else printf "\"" datea[1] " " monthval printf " " datea[4] " " datea[3] "\"" } if (i < tna) printf ", " } printf ") \\g\n" } /^udb-indirect/ { indirect= 1 } /^poly/ { if (!first_poly) { first_poly= 1 printf "create poly_topology " printf "(edge_fn= int4, " printf "centroid_fn= int4, l_or_r= char, " printf "e_or_i= char) \\g\n" } printf "append poly_topology(edge_fn= " $2 printf ", centroid_fn= " $3 printf ", l_or_r= '"'"'%s'"'"'", $4 printf ", e_or_i= '"'"'%s'"'"') \\g\n", $5 } ' $2 | monitor $1