miércoles, 16 de noviembre de 2011

Delimitadores o separadores de campo y campos de texto libre.

A veces, profesionalmente, me encontraba con ficheros, normalmente provenientes de las BB.DD. de la informática corporativa, que llegaban a mi o que salían de mi que contenían campos de texto libre, campos normalmente de comentarios, en los que los usuarios escribían libremente un texto. A veces la única limitación de ese texto era el número de caracteres que se podían poner, y a veces ni eso.
Si exportamos un fichero, con un campo de comentarios (texto libre), a un fichero de texto separado con delimitadores podemos encontrarnos que dentro del  campo de comentarios hay un delimitador (que por otra parte son caracteres muy comunes, espacios, comas, comillas, punto y coma, tabuladores, etc ).Si posteriormente importamos a excel el fichero de texto nos podemos encontrar que algún campo de comentarios crea campos no deseados, al contener delimitadores.  Es decir, desplaza datos de la columna que le corresponde.
Si recibimos un fichero en esta situación nos toca depurarlos a "mano". Si recibimos periódicamente ese tipo de ficheros debemos hablar con nuestro suministrador para que corrija ese problema y si somos nosotros los que creamos el fichero, somos nosotros los que debemos corregirlo.
Normalmente en los ficheros de este tipo (texto con delimitadores) que se tratan con Excel, los  campos de comentarios no se utilizan. Además no suele ser crítico sustituir o eliminar (dentro del texto del comentario) un carácter por otro, o sustituir un carácter por una combinación de caracteres poco probable (si queremos después rehacer el carácter original), y/o situar los campos de comentarios al final de la  línea, con lo que los desplazamientos de columna son menos rompedores.

domingo, 13 de noviembre de 2011

Delimitador de texto COMILLAS , caracteres de control o caracteres no visibles.

En la entrada anterior, en alguna de las líneas, hay que concatenar el carácter "comillas", que es el carácter que se normalmente como delimitador de texto (de hecho hay que incluirlo porque hay que delimitar un texto). Si incluimos unas comillas dentro de una función excel asume que lo que va a continuación es un texto fijo y si no las incluimos, asume que es otra función o una variable. Las comillas, como texto, las admite mal, hay que incluirlas mediante la función caracter(), código ASCII 34.

Algunos caracteres de control, como los ASCII 10 y 13 (y en general los menores a 32) tampoco se pueden incluir a "mano", también hay que incluirlos mediante la función CARACTER().  Esta función se puede utilizar con cualquier código ASCII, del cero al 255.

jueves, 10 de noviembre de 2011

Ficheros Gpx y ficheros PLT. Conversión de Plt a GPX.

Para los que además de MapSource instalado tienen Oziexplorer  esta conversión se realiza directamente desde cualquiera de las versiones de Oziexplorer que admitan la importación de ficheros GPX. Para convertir de camino (track) a waypoints o a ruta (en GPX o en PLT) yo no he encontrado nada, me lo tuve que hacer, programando, pero para aquellos interesados en Excel y GPS este puede ser un ejercicio interesante.

El trabajo de conversión que realizo a continuación en términos EXCEL es correcta independientemente del DATUM  que utilice el fichero PLT.  Si el DATUM que utiliza el fichero PLT es distinto de WGS84  a la hora de utilizar el GPS se produce un error que puede ser de cientos de metros.

El fichero Plt es un fichero de texto, editable con cualquier editor de textos. Es un formato propio de Oziexplorer. El fichero GPX también es un fichero de texto editable con cualquier editor de texto. Tanto uno como otro constan, basicamente, de una cabecera y de la localización de los puntos, coordenadas, altura, fecha y hora del momento en que se tomo el punto.

Fichero PLT:

OziExplorer Track Point File Version 2.1
WGS 84
Altitude is in Feet
Reserved 3
0,2,16711680,PuertoCanenciaValdemancoReal.gpx Convertido a PLT                 ,1,0,0,0
1920


40.8711260  , -3.7647177  ,0, 5794 , 40531.3771180556 , 2010-12-19 , 09:03:03
40.8710805  , -3.7647516  ,0, 5782 , 40531.3771759259 , 2010-12-19 , 09:03:08
40.8710777  , -3.7647554  ,0, 5768 , 40531.3771875 , 2010-12-19 , 09:03:09
40.8710748  , -3.7647584  ,0, 5754 , 40531.3771990741 , 2010-12-19 , 09:03:10
40.8710575  , -3.7647747  ,0, 5744 , 40531.3772106481 , 2010-12-19 , 09:03:11

En donde los dos primeros campos son la latitud y la longitud. El tercero (0) se utiliza si se divide el track, el cuarto campo es la altitud en pies y los otros campos son la fecha y la hora.

Fichero GPX



Formato punto del camino en GPX`
      <trkpt lat="40.8282234" lon="-3.8302293">
        <ele>1643.0302734</ele>
        <time>2011-10-09T07:57:34Z</time>
      </trkpt>


Nueva versión de esta conversión:

Es conveniente tener instalado y ver los resultados de la conversión con OpenOffice.

Funciones utilizadas:
Entero()
Espacios()
Texto
Uso de nombres.
De texto a datos.
El primer paso es pasar los datos del fichero de texto a la hoja excel, solo los datos, sin cabecera. En este caso lo hice con un copia-pega, aunque quizas debí importar esos datos directamente desde el fichero de texto. Una vez todos los datos en la columna A los pasé, mediante la opción de texto a datos, cada uno a su columna. Además los pase todos ellos como campo tipo texto con el fin de hacer las cosas paso a paso.
Las coordenadas, campos 1 y 2 (columnas A y B) se van a utilizar tal cual están, números separados por punto. La altura se tiene que pasar de pies a metros (aprox. pies*o,28). Esta multiplicación es una aproximación por lo que en el resultado podemos redondear, prescindir de los decimales. El primer campo fecha (considerado texto), números separados por un punto, hay que pasarlo a numérico (en notación española, en mi caso). Utilizo para ello la opción de texto en columnas, primero selecciona la columna a convertir,Datos->Texto en columnas, como solo es una columna, Ancho fijo, avanzamos hasta el paso tres y pulsamos el botón Avanzadas. Cambiamos para el separador decimal la coma por el punto  y para el separador de miles  el punto por la coma. Damos destino a ese cambio (el resultado puede sustituir a los datos originales) y ya tenemos el dato convertido a numérico. Calculo la altitud en metros, redondeo y coloco las etiquetas correspondientes (k) con :

="<ele>" & ENTERO(I2*PM) & "</ele>"

A la fecha con formato GPX y sus correspondientes etiquetas le doy forma (L) con la función texto y el formato de fecha correspondiente:

 ="<time>" & TEXTO(J2;"aaaa-mm-ddThh:mm:ssZ") & "</time>"

Las coordenadas y sus etiquetas son la cocatenación de valores de texto.

El punto completo de GPX incluye saltos de línea. Los saltos de línea son los códigos ASCII 13 (CR) y 10 (LF), retorno de carro y avance de línea de las ya muy antiguas (casi olvidadas) máquinas de escribir. Según el editor de textos que se utilice se puede notar la diferencia, o no. Se pueden encontrar ficheros de texto con ambos caracteres al final de la línea , o con uno solo de ellos. Realmente no suele dar problemas, salvo la aparición de líneas en blanco.

Para utilizar comodamente los caracteres  que necesito incluir mediante la funcion CARACTER(), les doy nombre (insertar->Nombre->definir):

CR =CARACTER(13)
LF=CARACTER(10)
CRLF=Cr & LF
COM (de comillas) =CARACTER(34)
PM (de pies a metros) =0,28
En las columnas con los puntos completos los utilizo:

=$M2 & CRLF& $K2 & CRLF& $L2 & CRLF& "</trkpt>"

Para poder utilizar estos datos en un fichero GPX editamos un fichero GPX con cabera y cola, copiamos (sin la cabecera o título de la columna excel)  y pegamos los puntos en el sitio correspodiente del fichero GPX y ya (si lo hacemos bien)  podemos utilizarlo, por ejemplo, en MapSource. Esta copia se hace mejor abriendo el fichero XLS con Open Ofice y los ficheros de texto con WordPad.

Ficheros GPX preparados.

martes, 8 de noviembre de 2011

Irradiación y factor K. Autocritica.




En la entrada anterior mencioné que era mejorable el traslado de los valores de K, no tenía que arrastrar la latitud a todas las líneas, y que el código provincial podía referenciarlo mediante un nombre en vez de una dirección.
Hoja TablasK
Funciones:
Decimal
Indirecto
Indice
Utilización de nombres.

 Incluimos el nombre mediante el submenú Insertar->Nombre->Definir, Cp y como dirección =MaxIrrad!$A$3. A partir de definir el nombre referenciamos este código como Cp ( INDICE(Irrad;CP;F$1), =INDICE(Irrad;CP;C3-1), etc).

Las tablas del factor K tienen todas ellas las mismas dimensiones, 19 filas y de la columna D a la P. Asegurandonos de que las líneas de separación entre tablas es la misma, podemos hacer un algoritmo para localizar la tabla dentro de la página, según la latitud.

En la hoja TablaK, celdas C1 a G1, podemos ver el algoritmo utilizado:

En C1 "factork!$d$" & $F$1 & ":$p$" & $G$1. Da una cadena alfanumérica que es la dirección de la matriz donde están los valores de K para una latitud determinada. Este valor lo utiliza la variable TablasK, utilizando la función INDIRECTO(TablaK!$C$1)

En D1 con  DECIMAL(LatPob;"0") hacemos la conversión que en la hoja MaxIrrad hice con TEXTO(LatPob;"0")
La primera latitud (28) se corresponde con un valor 0 en el algoritmo de cálculo de la línea inicial. Si las latitudes fuesen continuas este valor valdría para todas ellas, pero como las latitudes no son seguidas (28 y 29 para Canarias y entre 34 y 45 para el resto) en E1 utilizo  SI(D1<30;28;32). Viendo las tablas 28 es el primer valor y se corresponde con un cero, 29 segundo valor se corresponde con un uno y 34 tercer valor se corresponde con un dos (34-32).   
En F1 calculo la línea donde empieza la tabla de la latitud de D1 22*($D$1-$E$1)+8+2 (8 primeras líneas dedicadas a la cabecera de la hoja y 2 las líneas que no utilizamos de las tablas) 
En G1 $F$1+18 obtengo la última línea util de la tabla.
Para trasladar valores utilizo =INDICE(TablasK;$A4;C$3)


domingo, 6 de noviembre de 2011

Irradiación y Factor K

La irradiación es la energía aportada por el sol sobre una superficie horizontal. El factor K es una constante que multiplica esa energía en función de la la inclinación del plano y de la latitud. Tanto la irradiación  como el factor K vienen tabulados. En este caso la tabla de irradiación se refiere a la irradiación media mensual de las provincias españolas y las tablas del factor k incluyen las latitudes 28º y 29º (Canarias) y de la 35º a 45º (península y Baleares).
El trabajo consiste en conocer para una población determinada, seleccionada mediante un desplegable para seleccionar la provincia y otro para seleccionar la población, la inclinación con la que debemos colocar un panel solar para optimizar la instalación.
La selección de población es la misma que la explicada en las entradas anteriores dedicadas a las zonas climáticas de España.

Funciones Excel utilizadas:
Texto()
Indice()
Max()
Coincidir()
Suma()
Si()
Utilización de nombres.

Algunas hojas, algunas columnas y algunas filas están ocultas pero no protegidas.
Las tablas originales estaban ordenadas por orden alfabético.  Siguiendo el criterio de que es mucho mejor ordenar por el código postal, como primera medida así lo hice. Incluí el C.P. y ordene las tablas según el C.P. para aquellas tablas que lo necesitaban.
En las tablas del factor K arrastré la latitud para todas las líneas (columna B de la hoja factor K) mediante la función:

 =SI(C8="";B7;C8)

La latitud aparece en este caso como parte de las cabeceras, en la columna C (pero solo en la cabecera).El algoritmo de la fórmula se interpreta como “si en Cx no hay nada toma el valor de la celda anterior  de la columna B y si tiene algo toma el valor de Cx”.  Como en primer lugar pensé en localizar, mediante la función Coincidir, la concatenación inclinación-latitud, necesitaba que todas las líneas tuvieran la latitud correspondiente. Esta manera de hacerlo es mejorable (de hecho en la hoja tablaK lo mejoro) para este caso, pero es muy útil si queremos, por ejemplo, pasar los datos de una hoja excel (como la que tenemos, con datos solo en la cabecera) a una tabla debase de datos.
Concatené la latitud y la inclinación en la columna A.
Como en la tabla K la latitud viene en grados enteros redondeo la latitud de la población mediante la función Texto (TEXTO(B7;"0") & "º" ), en la hoja MaxIrrad celda D7. Esta función, así utilizada, redondea, si los decimales son menores que 0,5 al entero anterior y si son mayor o igual al entero superior. En esta misma hoja, en columna A (de A4 a A21) utilizo la función Coincidir ( =COINCIDIR($E4 & $D$7;Incl;0) ) , en donde la concatenación $E4 y $D$7 es inclinación-latitud e Incl es el nombre de la columna A de FactorK. En A3 está el código provincial.
Al buscar la concatenación inclinación-latitud encuentro la línea de la hoja factorK en donde están los datos que necesito para esa inclinación.

La optimización se supone que se produce cuando se obtiene el máximo de energía (sumatorio de irradiación*factorK), por lo que necesitamos obtener los datos de irradiación de la provincia seleccionada y multiplicarlos por el factor k (para cada mes y cada inclinación). Los valores de irradiación los obtengo con la función:
 INDICE(Irrad;$A$3;I$1), en donde Irrad es el nombre de =Irradiación_H!$E$7:$Q$58, $a$3 es el código provincial (debí ponerle nombre) e I$1 es el número de mes. los datos sobre el factor k los obtengo mediante la formula =INDICE(TVal;$A4;I$1), donde Tval es el nombre de =FactorK!$E:$S (area de datos de factor K) y $A4 es el número de la línea donde están los datos.
En la columna obtengo la suma de la energía anual, en las columnas S y T la energía de invierno y de verano.
Mediante la función Max encuentro el máximo para cada mes o periodo de tiempo. A su vez busco ese máximo, con la función Coincidir en su columna. Con el número de línea obtenido, mediante la función Indice, coloco la primera inclinación, en grados, que nos da ese valor máximo. La formula es (para la columna R, anual):

=INDICE(Inclinaciones;COINCIDIR(R22;R4:R21;0))

El resalte, de color azul, de los máximos lo hago utilizando el formato condicional, para cada columna (valor de la celda = máximo de la columna)