R - Archivos binarios
Un archivo binario es un archivo que contiene información almacenada solo en forma de bits y bytes (0 y 1). No son legibles por humanos, ya que los bytes que contienen se traducen en caracteres y símbolos que contienen muchos otros caracteres no imprimibles. Intentar leer un archivo binario usando cualquier editor de texto mostrará caracteres como Ø y ð.
El archivo binario debe ser leído por programas específicos para que sea utilizable. Por ejemplo, el archivo binario de un programa de Microsoft Word se puede leer en una forma legible por humanos solo por el programa de Word. Lo que indica que, además del texto legible por humanos, hay mucha más información como formateo de caracteres y números de página, etc., que también se almacenan junto con caracteres alfanuméricos. Y finalmente un archivo binario es una secuencia continua de bytes. El salto de línea que vemos en un archivo de texto es un carácter que une la primera línea a la siguiente.
A veces, los datos generados por otros programas deben ser procesados por R como un archivo binario. También se requiere R para crear archivos binarios que se pueden compartir con otros programas.
R tiene dos funciones WriteBin() y readBin() para crear y leer archivos binarios.
Sintaxis
writeBin(object, con)
readBin(con, what, n )
A continuación se muestra la descripción de los parámetros utilizados:
con es el objeto de conexión para leer o escribir el archivo binario.
object es el archivo binario que se va a escribir.
what es el modo como carácter, entero, etc. que representa los bytes a leer.
n es el número de bytes para leer del archivo binario.
Ejemplo
Consideramos los datos incorporados R "mtcars". Primero creamos un archivo csv a partir de él, lo convertimos en un archivo binario y lo almacenamos como un archivo del sistema operativo. A continuación, leemos este archivo binario creado en R.
Escribir el archivo binario
Leemos el marco de datos "mtcars" como un archivo csv y luego lo escribimos como un archivo binario en el sistema operativo.
# Read the "mtcars" data frame as a csv file and store only the columns
"cyl", "am" and "gear".
write.table(mtcars, file = "mtcars.csv",row.names = FALSE, na = "",
col.names = TRUE, sep = ",")
# Store 5 records from the csv file as a new data frame.
new.mtcars <- read.table("mtcars.csv",sep = ",",header = TRUE,nrows = 5)
# Create a connection object to write the binary file using mode "wb".
write.filename = file("/web/com/binmtcars.dat", "wb")
# Write the column names of the data frame to the connection object.
writeBin(colnames(new.mtcars), write.filename)
# Write the records in each of the column to the file.
writeBin(c(new.mtcars$cyl,new.mtcars$am,new.mtcars$gear), write.filename)
# Close the file for writing so that it can be read by other program.
close(write.filename)
Leyendo el archivo binario
El archivo binario creado anteriormente almacena todos los datos como bytes continuos. Así que lo leeremos eligiendo los valores apropiados de los nombres de las columnas, así como los valores de las columnas.
# Create a connection object to read the file in binary mode using "rb".
read.filename <- file("/web/com/binmtcars.dat", "rb")
# First read the column names. n = 3 as we have 3 columns.
column.names <- readBin(read.filename, character(), n = 3)
# Next read the column values. n = 18 as we have 3 column names and 15 values.
read.filename <- file("/web/com/binmtcars.dat", "rb")
bindata <- readBin(read.filename, integer(), n = 18)
# Print the data.
print(bindata)
# Read the values from 4th byte to 8th byte which represents "cyl".
cyldata = bindata[4:8]
print(cyldata)
# Read the values form 9th byte to 13th byte which represents "am".
amdata = bindata[9:13]
print(amdata)
# Read the values form 9th byte to 13th byte which represents "gear".
geardata = bindata[14:18]
print(geardata)
# Combine all the read values to a dat frame.
finaldata = cbind(cyldata, amdata, geardata)
colnames(finaldata) = column.names
print(finaldata)
Cuando ejecutamos el código anterior, produce el siguiente resultado y gráfico:
[1] 7108963 1728081249 7496037 6 6 4
[7] 6 8 1 1 1 0
[13] 0 4 4 4 3 3
[1] 6 6 4 6 8
[1] 1 1 1 0 0
[1] 4 4 4 3 3
cyl am gear
[1,] 6 1 4
[2,] 6 1 4
[3,] 4 1 4
[4,] 6 0 3
[5,] 8 0 3
Como podemos ver, recuperamos los datos originales leyendo el archivo binario en R.