Está en la página 1de 7

Blog de

Alfonso Snchez Uzbal


, aka skotperez
rss
t
g+
gh
Autonoma digital y tecnolgica
Cdigo e ideas para una internet distribuida
Blog
Linkoteca
Autonoma digital
Cultura libre
Desarrollo web
Diseo grfico
GNU/Linux
Scripting y programacin
Usabilidad
Visualizacin de datos
WordPress
Buscar entradas
Usando un archivo de texto plano como base de datos: alternativa ligera a SQL
10 de mayo de 2013
Hay aplicaciones web para las que una base de datos SQL se le queda grande. Una base de datos SQL necesita un servidor
de base de datos que consume no pocos recursos en nuestra mquina; adems la base de datos necesita ser creada, junto a los
usuarios y sus permisos, hace falta configurar correctamente codificaciones, crear las diferentes tablas
Por otro lado, aunque los archivos SQL son archivos de texto plano, su edicin manual, sin utilizar los comandos que prove un
intrprete, como PHP por ejemplo, es tediosa. Para utilizar un conjunto de datos ya generado, generalmente hay que programar
un script que los formatee segn la sintaxis SQL para poder insertarlos en la base de datos.
Por qu no utilizar un archivo de texto plano como base de datos? Esto nos ahorra todo el trabajo relacionado con el
servidor de base de datos. Adems permite trabajar directamente con un archivo editable por una persona.
Las aplicaciones web que usan este sistema no necesitan instalacin propiamente dicha, basta con subir unos archivos PHP a
nuestro servidor web. Actualizar el contenido de la pgina es tan fcil como editar un archivo de texto y subirlo.
Como con una base de datos SQL, seguimos disfrutando de las ventajas de tener los datos y el cdigo separados. Casi todas las
aplicaciones para manejar datos permiten exportar a un archivo de texto plano, tipo CSV, lo cual evita tener que programar un
conversor para incorporar datos de manera masiva a nuestra aplicacin web.
Todo ventajas. Vamos a ver cmo podemos ponerlo en prctica.
PHP incluye un conjunto de comandos para comunicarse con un archivo de texto: abrirlo, leerlo y escribir en l. A grandes
rasgos todo lo que tenemos que hacer es:
Seguir un orden a la hora de guardar los datos en el archivo de texto, generar una estructura que PHP pueda interpretar.
Acceder a los datos del archivo desde PHP y ordenarlos en una matriz para poder usarlos.
Recorrer la matriz con un loop para generar la salida HTML.
La base de datos: el archivo de texto plano
Como ejemplo vamos a pensar en un archivo llamado contactos.txt que, a modo de agenda, contiene informacin sobre
nuestros contactos. Una buena manera de estructurar los datos podra ser la siguiente:
Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...
1 de 7 26/08/2014 08:45 p.m.
Nombre contacto 1|email contacto 1|website contacto 1|telfono contacto 1
Nombre contacto 2|email contacto 2|website contacto 2|telfono contacto 2
Bsicamente nos tenemos que preocupar de que en cada lnea haya un registro (un contacto en nuestro ejemplo), que cada
columna siempre contenga el mismo tipo de informacin, y que las celdas estn separadas siempre por el mismo caracter, a ser
posible que no vayamos a usar en su contenido.
Accediendo a los datos del archivo con PHP
Para acceder al archivo usamos la funcin fopen() de PHP. El parmetro r indica que estamos abriendo el archivo solo para leer
su contenido y coloca el puntero que lo ir recorriendo al principio.
Una vez ledo el archivo desde PHP y extrada la informacin, lo cerramos con fclose():
Para que PHP pueda acceder al archivo, tenemos que asegurarnos de que los permisos del archivo estn correctamente
configurados y la ruta que proporcionamos a la funcin fopen sea correcta. La entrada del manual de php.net sobre fopen
contiene informacin detallada sobre posibles problemas.
Montando el loop y generando la salida HTML
La funcin feof() comprueba si el puntero que recorre el archivo ha llegado al final de ste.
La funcin fgets() devuelve la lnea completa en la que est situado el puntero del archivo. Podemos limitar la salida de
fgets en bits (1024, 2048) si las lneas son largas y no las necesitamos completas.
El cdigo completo:
1 $fp = fopen('contactos.txt','r');
2 if (!$fp) {echo 'ERROR: No ha sido posible abrir el archivo. Revisa su nombre y sus
permisos.'; exit;}
1 fclose($fp);
1 $loop = 0; // contador de lneas
2 while (!feof($fp)) { // loop hasta que se llegue al final del archivo
3 $loop++;
4 $line = fgets($fp); // guardamos toda la lnea en $line como un string
5 // dividimos $line en sus celdas, separadas por el caracter |
6 // e incorporamos la lnea a la matriz $field
7 $field[$loop] = explode ('|', $line);
8 // generamos la salida HTML
9 echo '
10 <div>
11 <div>Nombre: '.$field[$loop][0].'</div>
12 <div>Email: '.$field[$loop][1].'</div>
13 <div>Website: '.$field[$loop][2].'</div>
14 <div>Telfono: '.$field[$loop][3].'</div>
15 </div>
16 ';
17 $fp++; // necesitamos llevar el puntero del archivo a la siguiente lnea
18 }
1 $fp = fopen('contactos.txt','r');
2 if (!$fp) {echo 'ERROR: No ha sido posible abrir el archivo. Revisa su nombre y sus
permisos.'; exit;}
3
4 $loop = 0; // contador de lneas
5 while (!feof($fp)) { // loop hasta que se llegue al final del archivo
6 $loop++;
7 $line = fgets($fp); // guardamos toda la lnea en $line como un string
8 // dividimos $line en sus celdas, separadas por el caracter |
9 // e incorporamos la lnea a la matriz $field
10 $field[$loop] = explode ('|', $line);
11 // generamos la salida HTML
12 echo '
13 <div>
14 <div>Nombre: '.$field[$loop][0].'</div>
15 <div>Email: '.$field[$loop][1].'</div>
16 <div>Website: '.$field[$loop][2].'</div>
17 <div>Telfono: '.$field[$loop][3].'</div>
Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...
2 de 7 26/08/2014 08:45 p.m.
Casi todo este manual est basado en el estupendo artculo sobre el tema publicado en designdetector.
Contexto
Desarrollo web, base de datos, CSV, fclose, feof, fgets, fopen, MySQL, opendata, PHP, sql
Autor
Alfonso Snchez Uzbal
, aka skotperez
Contenido relacionado
Razn y ser de la programacin abierta y distribuida, sesin en #thinkcommons
Cmo incluir un archivo en una variable: funciones de control de salida y bufers en PHP
Cmo ejecutar PHP peridicamente con cron en un servidor Linux
Nuevas plataformas para blogs, recuperando la esencia del blogging
Migrar grandes (y pequeas) bases de datos, fcilmente y sin limitaciones, usando la lnea de comandos
Compartir
t
f
g+
13 comentarios
Por MIQUEL BORDERA SALADIE 18 de marzo de 2014
Hola:
Yo en mis aplicaciones web (tanto en internet como en entornos land) estoy usando bases de datos utilizando archivos de
texto plano accediendo a ellos utilizando PERL. Lo que pasa es que para archivos muy grandes (digamos de varios miles o
decenas de miles de registros) lo que hago es poner la condicion de que los registros tengan el mismo numero de
caracteres, aunque sean espacios en blanco puestos de forma automatica.
Esta condicion tiene la ventaja de poder acceder y modificar directamente a un registro (respetando, eso si, la longitud
maxima de caracteres) sin tener que cargar todo el archivo en un array para modificarlo en memorya y luego reescribirlo
todo en el disco duro.
El hecho de manejar archivos planos desde tu propio programa ademas, siempre que tu programa sea eficiente, hace que
sea un acceso muy rapido, puesto que no hace falta utilizar intermediarios.
Yo nunca modifico mis archivos manualmente porque la interfaz de mis aplicacones me permite hacerlo de forma directa.
No obstante podria hacerse manualmente siempre y cuando se respetara la longitud fija de cada linea de texto o se
reprocesara con una sencilla aplicacion el archivo una vez modificado para ajustar las longitudes de las lineas de texto.
Obviamente esto es una alternativa a las bases de datos SQL sin desmerecerlas por ello.
Un saludo.
Miquel

1.
Por skotperez 24 de marzo de 2014
Gracias por compartir aqu tu solucin, Miguel. Efectivamente estas soluciones son alternativas a SQL en
determinados proyectos que no necesitan una gran infraestructura de base de datos. Esto no significa que haya que
abandonar por completo SQL, nicamente que hay proyectos a los que les viene mejor otro tipo de gestin de los
datos.
No entiendo por qu los registros tienen que tener un nmero de caracterres fijo.
Un saludo
1.
18 </div>
19 ';
20 $fp++; // necesitamos llevar el puntero del archivo a la siguiente lnea
21 }
22
23 fclose($fp);
Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...
3 de 7 26/08/2014 08:45 p.m.

Por MIQUEL BORDERA 24 de marzo de 2014


Hola:
El hecho que los registros tengan un tamao fijo tiene dos grandes ventajas:
1-. Puedes acceder directamente a un registro sin tener que recorrer todo el archivo. Por ejemplo, si cada registro tiene 150
caracteres (sean los que sean) y quieres ir al registro 20000, lo unico que tienes que hacer es poner el puntero del fichero
en la posicion 150 x 20000 = 3000000.
2-. Si la longitud fija de los registros esta bien estimada como la longitud maxima que vas a necesitar en el futuro, puedes
modificar tranquilamente el registro 20000 sin sobreescribir el registro 20001 y sin que el resto de registros desplacen su
posicion fisica dentro del archivo y sin tener que reescribir todo el archivo. Si en el futuro se diera el caso que necesitaras
mas longitud para tus registros podrias o bien redimensionar el archivo con un sencillisimo programa que puedes hacerte tu
mismo o bien puedes poner desde un principio un campo en cada registro para poder incluir un numero de registro de
continuacion del contenido de este registro en caso de necesitar mas espacio.
Yo utilizo este formato de archivo, entre otras cosas, en una base de datos que tengo de envio y recepcion de paqueteria y
lo que hago es por un lado mantener automaticamente un indice en otro archivo de texto de pqueo tamao con los
numeros de registros de pedidos no finalizados y ademas en cada registro tengo un campo que lo relaciona con lel numeros
de registro del pedido anterior y posterior del mismo proveedor, de forma que con gran velocidad puedo ver en cada
momento el estado de mis pedidos. Obviamente tambien tengo una opcion para realizar una busqueda avanzada de pedidos
atrasados o actuales por diferentes criterios de busqueda en donde aqui si que lo que hace es recorrer todo el archivo de
arriba a abajo. Ahora bien, una vez encontrado un registro en cuestion es pan comido encontrar los registros relacionados
con la informacion de registros relacionados guarada en el campo para tal fin. Si quiero modificar datos de un pedido,
simplemente lo que hago es modificar ese registro sin tocar el resto del archivo.
Para archivos pequeos todo esto no tiene mucho sentido, pero como mas grande es el archivo mas aficiencia ganas en los
procesos de lectura, escritura y busqueda. Todo es cuestion de hecharle imaginacion al tema.
Un saludo.
Miquel

2.
Por skotperez 25 de marzo de 2014
Muchas gracias por la explicacin, Miquel. Es un sistema bien optimizado el que describes. Me lo apunto.

1.
Por Charles Xavier 24 de marzo de 2014
Hola
Quiero almacenar el archivo de texto del cual leeria y escribiria en dropbox.
Me permite leer el archivo e imprimir los datos del archivo en una pagina .html pero cuando quiero escribir sobre el no me
es posible, no me manda ningun error solo no lo hace, pero tampoco he debuggeado el codigo solo cambie los modos de la
apertura del archivo (r,r+,a,a+).
Ya lo valide escribiendo sobre el archivo cuando esta en la misma carpeta que la pagina .php y no tengo ningun problema
lo hace de maravilla
El archivo sobre el que escribo es .html, tambien lo probe con un .txt y tampoco funciona. Tendran alguna idea si sera
cuestion de permisos por parte de dropbox o como hacerlo en caso de ser posible?
*Tengo servicio de host gratuito y solo tengo 1gb de almacenamiento, en dropbox tengo mayor capacidad
saludos

3.
Por skotperez 25 de marzo de 2014
Hola Charles Xavier,
para escribir en un archivo desde PHP debes abrirlo en modo escritura. En el ejemplo de arriba lo hemos abierto en
modo lectura, como denota el parmetro r: fopen(contactos.txt,r);
1.
Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...
4 de 7 26/08/2014 08:45 p.m.
Puedes ver todos los modos en los que interactuar con un archivo en la pgina fopen de php.net.
Si es un problema con Dropbox no te puedo ayudar: nunca he trabajado con l y no conozco su API.

Por PolloFrito 23 de mayo de 2014


Estoy buscando unas lneas de cdigo para presentar una base de datos en txt, de forma paginada (primera pgina lineas
1 a 5, segunda pgina lneas 6 a 10, etc..), para presentar los resultados agrupados de 5 en 5 (o de 10 en 10 o como se
decida), estilo resultados google.. Saludos

4.
Por skotperez 23 de mayo de 2014
Hola PolloFrito, este cdigo te vale. Para contar las lneas puedes usar el counter de lneas del loop: en el cdigo de
arriba es la variable $loop. Con esta variable puedes decir que muestre los resultados si $loop es menor o igual que 4
(empieza en 0). De esta manera, en la pgina 1 mostraras las lneas de 1 a 5; la pgina 2 puedes hacerla pasando una
variable mediante $_GET para que empiece a contar en el resultado 5.
Si tienes dudas sobre cmo pasar variables mediante $_GET puedes consultar el post Cmo pasar variables de una
pgina a otra en una web con PHP.
Saludo

1.
Por Alex 07 de junio de 2014
Buenas tardes, muchas gracias por el cdigo y me sirvi de mucho ya que soy nuevo programando en php y en estos
momentos estoy realizando un proyecto de tarea en la cual debo realizar la validacin de usuarios con su ID y su Password
o su respectivo registro. La validacin de usuarios y registros ya lo tengo realizado pero Cmo puedo hacer para validar la
informacin del archivo .txt y modificar los datos especficos del usuario que haya iniciado sesin?
Si me pueden colaborar con ello estar muy agradecido.
Saludos

5.
Por skotperez 08 de junio de 2014
Hola Alex,
si el usuario inicio sesin con un formulario tienes sus datos en la variable global de php $_POST o $_GET, segn el
method que us el formulario. Una vez que tienes los datos de sesin en variables puedes compararlos con los del archivo
.txt y modificarlos o lo que necesites. Puedes echar un ojo a este otro post sobre manejo de variables $_POST y $_GET.
Tambin puedes guardar los datos de sesin en una cookie. Esto te sirve para tenerlos siempre disponibles.

6.
Por MIQUEL BORDERA SALADIE 25 de julio de 2014
Hola:
Siguiendo con mis comentarios de mas arriba en los que hablaba de utilizar ficheros de texto con registros de igual
longitud, en forma de tabla, aadire que si el campo de busqueda de un registro sabemos con certeza que esta ordenado en
sentido creciente o decreciente (ya sean numeros o caracteres alfanumericos) podemos crearnos una rutina de busqueda
por biseccion en lugar de tener que recorrer todo el archivo o tener un indice paralelo con informacion adicional.
Me explico: si tenemos un archivo, pongamos con 100000 (cien mil) registros, lo que haremos primero sera leer
directamente el registro 50000 y comprobar si el registro buscado esta por encima o por debajo de este. Si esta por encima
iremos al registro 75000 y haremos la misma comprobacion y si esta por debajo iremos al registro 25000.y haremos lo
mismo, hasta que el valor buscado sea el encontrado o si no existe, lo saberlo tambien con certeza. En este caso
simplemente necesitaremos como mucho leer 17 registros para un valor de busqueda aleatorio, mientras que haciendolo de
forma secuencial necesitariamos leer un promedio de 50000 registros, suponiendo un valor de busqueda tambien aleatorio.
En terminos generales el numero de registros que necesitamos leer en una busqueda por biseccion es: n = logaridmo en
base 2 del numero de registros de nuestra base de datos.
7.
Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...
5 de 7 26/08/2014 08:45 p.m.
Un saludo.
Miquel Bordera

Por Aaron Lugo 14 de agosto de 2014


Hola
Alfonso Snchez Uzbal, aka skotperez
Me ah sido de mucha utilidad tu post eh aadido cosas de mi cosecha y todo va viento en popa, sin embargo no tengo
mucha experiencia en PHP y no eh logrado filtrar mis resultados; por ejemplo si solo quisiera mostrar a los contactos con
el nombre Luis. si pudieras ayudarme me seria de gran utilidad, estar muy agradecido.

8.
Por skotperez 18 de agosto de 2014
Hola Aaron,
para hacer bsquedas en una base de datos de este tipo, contenido en un archivo de texto plano, puedes usar el
mtodo que comenta Miquel en los comentarios.
De manera ms ineficiente, aunque eficaz tambin, puedes hacer un loop con foreach y una sentencia condicional
que haga lo que quieras cuando la vuelta del loop contenga lo que ests buscando, por ejemplo Luis.

1.
Dejar un comentario
* Nombre
* E-mail (no se publicar)
Sitio web
Comentario

No hay trackbacks
Sobre este blog
Autonoma digital y tecnolgica es el blog de Alfonso Snchez Uzbal desde 2007. En l encontrars trozos de cdigo en
diferentes lenguajes de programacin (snippets), reflexiones sobre autonoma digital y tecnolgica, software libre y cultura libre
en general. Los textos estn disponibes bajo Creative Commons, y el cdigo bajo GPL.
Avsame con un correo electrnico cuando haya un nuevo comentario.
Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...
6 de 7 26/08/2014 08:45 p.m.
Proyectos
cRTweet
Desarrolladores en red
Ecometro
Eventweet
Meipi
montera34
Obsoletos
simplitt
Red
Francesco Cingolani
I write about computational design, collaborative culture, food, social eating and lifestyle design in Italian, French, Spanish and English.
Domenico Di Siena
I write about Shareable City, Commons, Social Innovation, Collaborative Culture, Regional Planning, Sharing Economy in Italian, English, Spanish and
French.
Juan Lpez-Aranguren
Repair is a process associated with usability, to restore their useful properties to an object. But not only has to do with the return to use: in repair processes
we can appreciate the aesthetics, creativity, affection and humor ... that defined a relationship between the people and their things.
Pablo Rey Mazn
I write about data visualization, social movements and media monitoring in Spanish and English.
Alfonso Snchez Uzbal
I write about digital autonomy, appropiated technology and internet products development, mostly in Spanish.
Members
Usando un archivo de texto plano como base de datos: alternativa ligera... http://voragine.net/weblogs/usando-un-archivo-de-texto-plano-como-ba...
7 de 7 26/08/2014 08:45 p.m.