Se trata de un formato de archivo personalizado y único, por lo que no esperes que las herramientas habituales lo lean correctamente.
El archivo de documentación describe el contenido de forma clara y (en su mayor parte) precisa. Lógicamente, el archivo está organizado en "cuadrículas". Cada cuadro de rejilla contiene una tabla de información por año y mes, junto con información resumida por año (precipitación en 0,1 mm) e información resumida para el propio cuadro de rejilla. Físicamente, cada cuadro de cuadrícula está representado por una línea de cabecera seguida de una línea para cada año. Las líneas están en formato fijo ASCII (producido por un programa Fortran, evidentemente).
Aunque lógicamente hay tres tablas aquí -cuadros, años y meses-, lo más sencillo sería "aplanar" todo como si se hubieran unido todos los datos, con un registro por mes. Esto podría añadirse a cualquier SIG como una capa de "eventos puntuales XY", que podría consultarse para cualquier mes y convertirse en formato raster para su posterior análisis (o mantenerse tal cual para resúmenes estadísticos).
La tarea principal, pues, es hacer el reformateo. Python lo hará muy bien, pero sigo prefiriendo AWK por su rápido ciclo de desarrollo y su claridad, así que aquí está mi solución rápida y sucia (pero probada) para AWK. (El GNU AWK, GAWK, funciona en Windows y otros sistemas. Está disponible gratuitamente). Puedes ver que simplemente selecciona todos los campos dentro de los dos tipos de líneas físicas - "cabecera" y "datos"- y los escupe de vuelta, aplanados (es decir, mostrando todos los valores actuales de todos los campos en cada registro) y delimitados por tabulaciones. Realiza una comprobación de errores mínima, suponiendo que la entrada ha sido formateada correctamente y no está corrompida. Se ejecuta desde un shell o una línea de comandos de la siguiente manera
awk -f [name of file.awk] [name of input file.dat] > [name of output file]
Por ejemplo, en mi sistema nombré este archivo AWK y.awk
extrajo el archivo de datos de precipitación comprimido en F:/temp/
y mi comando fue
awk -f y.awk f:\temp\g55wld0098.dat > y.txt
Después de simbolizar el tema del evento XY en ArcMap 10 por nombre de país, seleccionando los datos de diciembre de 1990 ( "Year" = 1990 AND "Month" = 12
), y al convertirlo a formato shapefile (por eficiencia), quedó así, todo listo para el análisis o la conversión a formato raster.
(Tenga en cuenta que todos los valores están en décimas de milímetro).
Como el intento de mostrar o procesar todos los datos (alrededor de 10^5 registros) hace que mi copia de ArcGIS 10 se ponga de rodillas, puede que tu SIG también se ralentice. Una solución es filtrar los datos que desea durante la conversión AWK para que su SIG tenga menos registros que tratar. Sólo tiene que modificar la prueba de los datos que faltan para omitir cualquier otra cosa que no quiera en la salida. (Esto es un orden de magnitud más rápido que filtrar los datos en el propio ArcGIS). También podría modificar este programa para dar salida a los datos directamente en un formato raster ASCII (como múltiples archivos, uno por mes y por año), pero eso requeriría un poco más de habilidad y podría ser poco fiable, porque no hay garantía de que la entrada esté físicamente ordenada por cuadrícula).
#
# Global precipitation data (http://www.cru.uea.ac.uk/cru/data/precip/)
#
# Header (I7,I5,I6,I5,A15,I4,A14,2I4,I7,I9):
# 388-6250 -4250 4ANTARCTICA 1 85% 85% 0% 19001998 388 1
#
# Data (I4,12I5,I6):
#1900 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10 -10
#
# ("-10" is the null value. It will be output unchanged.)
#
# NB: the final data record may have some invisible non-numeric characters and
# so is left unconverted; it is in 0.1 mm.
#----------------------------------------------------------------------------------#
BEGIN {
nrecs = 0 # Number of records output
maxerr = 20 # max error messages
errcount = 0
OFS = "\t" # Output field separator
#
# Print a header line of field names.
#
print "Gridbox", "Lat", "Lon", "Altitude", "Country", "N", "Start", "End",
"Diag1", "Diag2", "Precip", "Year", "Month", "Value"
}
length($0)!=70 && substr($0, 1, 7) == substr($0, 65, 7) { # Possible header
gridbox = substr($0, 1, 7) + 0
lat = substr($0, 8, 5)/100.0
lon = substr($0, 13, 6)/100.0
alt = substr($0, 19, 5) + 0
country = "\"" substr($0, 24, 15) "\""
n = substr($0, 39, 4) + 0
diagnostic = substr($0, 43, 14)
start = substr($0, 57, 4) + 0
end = substr($0, 61, 4) + 0
gridbox2 = substr($0, 65, 7) + 0
diagnostic2 = substr($0, 72, 9)
nrecs++
printf("\rGrid box %-8d", nrecs) > "/dev/stderr"
next
}
length($0)!=70 && errcount <= maxerr {
print "Unable to interpret record " NR >> "/dev/stderr"
errcount ++
next
}
{ # Data record
year = substr($0, 1, 4)
precip = substr($0, 65) # (There are problems treating this value as numeric...)
#
# Print a data line for each month.
#
for (month = 1; month <= 12; month ++) {
value = substr($0, 5*month , 5) + 0 # In 0.1 mm
if (value != -10) { # Skip missing values
print gridbox, lat, lon, alt, country, n, start, end,
diagnostic, diagnostic2, precip, year, month, value
}
}
}
END {
print "\r" nrecs " gridbox records output." > "/dev/stderr"
if (errcount > 0) print errcount " errors encountered." > "/dev/stderr"
}