PDA

Ver la Versión Completa : Binario a Texto


gusspagano
17-05-2012, 23:25:07
Hola a todos, tengo un problema y les agradecería mucho su ayuda.

tengo un archivo binario, el cual quiero convertir a texto he usado la función blockread y luego intento escribir lo que leyó la función en un txt, algo asi:

procedure TForm1.Button1Click(Sender: TObject);
var
arc:file;
b:word;
i:integer;
arr:textfile;
begin
assignfile(arc,'I:\Radar raw data\20080101 a 20080219\RAW_NA_000_236_20080101001008');
reset(arc,2);
assignfile(arr,'D:\Users\Alvao\Desktop\culos.txt');
ReWrite(arr);
while not eof (arc) do
begin
blockread(arc,b,1);
Write(arr,inttostr(b));
end;
end;

Lo único que veo en el archivo que creo son puros números.

Se supone que el binario es de texto, me explico, es texto que pusieron en un archivo binario por que un txt estaría muy pesado, entonces yo necesito abrir el binario convertirlo a texto, leer una parte de él guardarlo en otro txt.

ya tengo rato con esto no nomas no puedo,

gracias por su ayuda.

ecfisa
18-05-2012, 02:22:19
Hola gusspagano.

Creo que tenes que dar mas detalles...

¿ Que tipo de datos tiene el archivo "RAW_NA_000_236_20080101001008" ? Por el nombre pareciera una imagen en formato RAW (http://en.wikipedia.org/wiki/Raw_image_format), pero no podría asegurarlo sin ver la extensión.


Se supone que el binario es de texto, me explico, es texto que pusieron en un archivo binario por que un txt estaría muy pesado
¿ Como que el binario es de texto ? Un archivo binario no es de texto aún si se le cambia la extensión. Por otro lado si el archivo de texto fuera muy pesado (para enviarlo supongo) lo normal sería comprimirlo con alguna herramienta.

Por eso te decía que tendrías que dar más detalles sobre el formato del archivo orígen y también que que es lo que deseas hacer con lo que leas de él.

Si no se corre el riesgo de hacer las cosas como el traste... ('D:\Users\Alvao\Desktop\culos.txt') :)

Saludos.

gusspagano
18-05-2012, 06:39:33
jajaja, que tal ecfisa,

mira, el archivo que tengo es generado por un radar, el archivo no tiene extensión (así se genera) se supone que el tipo de dato que contiene es texto, primero un encabezado, después cantidades que representan la reflectividad que mide el radar en un espacio dado en la atmósfera.

ahora el radar genera dos archivos de estos cada 15 minutos y pesan al rededor de 400 KB, como la cantidad de archivos que genera el radar es bastante considerable (192 al dia por 365 dias al año, etc.) se genera un binario por que su tamaño en mucho menor que un txt, lo que quiero hacer con este archivo es leer una parte de él para calcular precipitación a partir de la reflectividad.

Este es un ejemplo que viene en el manual del radar, algo así debería verse el archivo una vez convertido a texto.

0 12 <raw_prod_bhdr>
12 76 <ingest_data_header>
88 SINT2 –32762 (code for six data words to follow)
90 BIN2 0 (starting azimuth) Six
92 BIN2 91 (starting elevation) words
94 BIN2 182 (ending azimuth) referred
96 BIN2 91 (ending elevation) to
98 SINT2 200 (number of range bins) above
100 UINT2 3 (time)
102 SINT2 50 (code for fifty zeros skipped)
104 SINT2 –32767 (code for one data word follows)
106 SINT2 128 (zero velocity value) One data word
108 SINT2 49 (code for forty nine zeros skipped)
110 SINT2 1 (code for end of ray)
112
(Continues on to next ray)

ecfisa
18-05-2012, 07:55:06
Hola gusspagano. :)

Entendido perfecto lo del archivo de texto y también que se lo almacena en otro formato para ganar espacio. (Y que no tiene nada que ver con la anatomía. :D)

El problema es saber con que formato es guardado el archivo 'RAW_NA_...', por que de eso depende la interpretación que le demos al leerlo.

Mi pregunta concreta es: ¿ El archivo es generado por un programa de tu autoría o por una aplicación de terceros ?

Si es el primer caso, no veo mucha dificultad ya que con decirnos como se guarda asunto solucionado, pero de otro modo es más complicado.
La opción más sencilla sería buscar el formato en los manuales o comunicarse con el/los autores para consultarlo.
La otra es tratar de inferir el formato a partir de la comparación entre el archivo generado y su equivalente de texto. Pero esto puede ser muy pero muy trabajoso, sobre todo por que es muy probable que se haga algun tipo de compresión de los datos antes de guardarse.

Un saludo.

gusspagano
18-05-2012, 08:09:11
Hola de nuevo,

La aplicación que genera los archivos es del fabricante del radar, ahora, a que te refieres con el "formato"?, (perdón por esta pregunta la verdad se muy poco de informática y programación), se que el archivo es binario y que son palabras de 16 bits según el manual, también conozco el algoritmo de compresión/descompresión (el que según yo podré aplicar una vez tenga el archivo de texto), no se si haga falta saber algo más.

Disculpa si no me doy a entender bien, no se mucho de estas cuestiones.

ecfisa
18-05-2012, 08:55:32
Hola.

No te disculpes te has explicado perfectamente.

Cuando hablo del formato me refiero a como guarda los datos en el archivo, si se guarda el valor ASCII de de los caracteres, o se empaquetan por algún método (Ocho en siete, suprimiendo caracteres no utilizables, etc.)

En resumidas cuentas, la cuestión es como interpretar los datos almacenados en ese archivo binario. Es decir ¿Que debemos leer ? Un Byte, Integer, Word,... y una vez sabido el tipo que vamos a leer, ¿ Como extraemos cada caracter de allí ?

Saludos.

gusspagano
20-05-2012, 22:45:35
Hola,

Bueno, al parecer se guardan los valores ASCII pues el manual no dice otra cosa, y en cuanto a lo que hay que leer es Word (palabras de 16 bits), ahora, es esto suficiente para convertir a texto??, que función puedo usar??

ecfisa
20-05-2012, 23:29:11
Hola,

Bueno, al parecer se guardan los valores ASCII pues el manual no dice otra cosa, y en cuanto a lo que hay que leer es Word (palabras de 16 bits), ahora, es esto suficiente para convertir a texto??, que función puedo usar??
Hola gusspagano.

Ateniendome a lo que me comentas, una forma de leerlo sería:

var
FileWord: file of Word;
s: string;
W: Word;
begin
AssignFile(FileWord, 'C:\TU_RUTA\TU_ARCHIVO.BIN');
try
Reset(FileWord);
with TStringList.Create do
try
while not Eof(FileWord) do
begin
s:= '';
repeat
Read(FileWord, W);
s:= s + Chr(W);
until (W = 13) or Eof(FileWord);
if not Eof(FileWord) then TS.Add(s);
end
finally
// El contenido ya está en TS.
// Como ejemplo copio a un Memo y luego libero TS
Memo1.Lines:= TS;
TS.Free
end
finally
CloseFile(FileWord)
end
end;

Saludos.

gusspagano
22-05-2012, 19:14:47
Hola ecfisa,

lo intente pero sigo viendo puros simbolos, voy a checar otra vez el manual y a ver que encuentro, si logro hacer algo lo comento.

Muchas gracias por tu ayuda.

gusspagano
05-06-2013, 21:09:06
Pues bien, después de más de un año, pude convertir mis archivos RAW en TXT. Resulta que el archivo estaba basado en palabras de 16 bits (declaré el archivo como "file of word"), y estructurado en registros (de 6144 bytes cada uno), así que todo lo que leía eran cantidades entre 0 y 65535 (rango de valores de enteros sin signo de 16 bits). Luego, cada uno de esos datos o cantidades leidas correspondía a un valor que aplicando una formula que se encuentra en el manual del radar me da el valor de reflectividad, con el cual ya puedo estimar precipitación.

Por último use el código de compresión que viene en el manual para descomprimir los archivos. El código consiste en reemplazar cadenas de ceros por un número que indica la cantidad de ceros que han sido reemplazados.

Listo, luego solo automaticé el proceso para leer los más de 60 mil archivos RAW y generar imágenes de precipitación acumulada en 24 horas.

Esto probablemente no le interese a muchas personas, pero por si hubiera alguien por ahí que se tope con un problema similar al mio, sepa que si hay una solución, que me costó mucho encontrar, pero finalmente pude hacerlo.

Saludos ecfisa y gracias por tu ayuda.

Casimiro Notevi
05-06-2013, 21:19:37
^\||/
.