Autonomía digital y tecnológica

Código e ideas para una internet distribuida

Usando un archivo de texto plano como base de datos: alternativa ligera a SQL

Imago voragine.net
[actualizado el ]

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 máquina; además 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 edición manual, sin utilizar los comandos que proveé un intérprete, como PHP por ejemplo, es tediosa. Para utilizar un conjunto de datos ya generado, generalmente hay que programar un script que los formatee según 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. Además permite trabajar directamente con un archivo editable por una persona.

Las aplicaciones web que usan este sistema no necesitan instalación propiamente dicha, basta con subir unos archivos PHP a nuestro servidor web. Actualizar el contenido de la página es tan fácil 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 código 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 aplicación web.

Todo ventajas. Vamos a ver cómo podemos ponerlo en práctica.

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 información sobre nuestros contactos. Una buena manera de estructurar los datos podría ser la siguiente:

Nombre contacto 1|email contacto 1|website contacto 1|teléfono contacto 1
Nombre contacto 2|email contacto 2|website contacto 2|teléfono contacto 2

Básicamente nos tenemos que preocupar de que en cada línea haya un registro (un contacto en nuestro ejemplo), que cada columna siempre contenga el mismo tipo de información, y que las celdas estén 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 función fopen() de PHP. El parámetro r indica que estamos abriendo el archivo solo para leer su contenido y coloca el puntero que lo irá recorriendo al principio.

$fp = fopen('contactos.txt','r');
if (!$fp) {echo 'ERROR: No ha sido posible abrir el archivo. Revisa su nombre y sus permisos.'; exit;}

Una vez leído el archivo desde PHP y extraída la información, lo cerramos con fclose():

fclose($fp);

Para que PHP pueda acceder al archivo, tenemos que asegurarnos de que los permisos del archivo estén correctamente configurados y la ruta que proporcionamos a la función fopen sea correcta. La entrada del manual de php.net sobre fopen contiene información detallada sobre posibles problemas.

Montando el loop y generando la salida HTML

$loop = 0; // contador de líneas
while (!feof($fp)) { // loop hasta que se llegue al final del archivo
$loop++;
$line = fgets($fp); // guardamos toda la línea en $line como un string
// dividimos $line en sus celdas, separadas por el caracter |
// e incorporamos la línea a la matriz $field
$field[$loop] = explode ('|', $line);
// generamos la salida HTML
echo '
 <div>
  <div>Nombre: '.$field[$loop][0].'</div>
  <div>Email: '.$field[$loop][1].'</div>
  <div>Website: '.$field[$loop][2].'</div>
  <div>Teléfono: '.$field[$loop][3].'</div>
 </div>
';
$fp++; // necesitamos llevar el puntero del archivo a la siguiente línea
}
  • La función feof() comprueba si el puntero que recorre el archivo ha llegado al final de éste.
  • La función fgets() devuelve la línea completa en la que esté situado el puntero del archivo. Podemos limitar la salida de fgets en bits (1024, 2048…) si las líneas son largas y no las necesitamos completas.

El código completo:

$fp = fopen('contactos.txt','r');
if (!$fp) {echo 'ERROR: No ha sido posible abrir el archivo. Revisa su nombre y sus permisos.'; exit;}

$loop = 0; // contador de líneas
while (!feof($fp)) { // loop hasta que se llegue al final del archivo
$loop++;
$line = fgets($fp); // guardamos toda la línea en $line como un string
// dividimos $line en sus celdas, separadas por el caracter |
// e incorporamos la línea a la matriz $field
$field[$loop] = explode ('|', $line);
// generamos la salida HTML
echo '
 <div>
  <div>Nombre: '.$field[$loop][0].'</div>
  <div>Email: '.$field[$loop][1].'</div>
  <div>Website: '.$field[$loop][2].'</div>
  <div>Teléfono: '.$field[$loop][3].'</div>
 </div>
';
$fp++; // necesitamos llevar el puntero del archivo a la siguiente línea
}

fclose($fp);

Casi todo este manual está basado en el estupendo artículo sobre el tema publicado en designdetector.

59 comentarios

    • Por MIQUEL BORDERA SALADIE •

    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. Gracias por compartir aquí tu solución, 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 gestión de los datos.

      No entiendo por qué los registros tienen que tener un número de caracterres fijo.

      Un saludo

    • Por MIQUEL BORDERA •

    Hola:

    El hecho que los registros tengan un tamaño 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 pqueño tamaño 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 pequeños 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

    1. Muchas gracias por la explicación, Miquel. Es un sistema bien optimizado el que describes. Me lo apunto.

    • Por Charles Xavier •

    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

    1. 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 parámetro «r»: fopen(‘contactos.txt’,’r’);

      Puedes ver todos los modos en los que interactuar con un archivo en la página 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 •

    Estoy buscando unas líneas de código para presentar una «base de datos» en txt, de forma paginada (primera página lineas 1 a 5, segunda página líneas 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

    1. Hola PolloFrito, este código te vale. Para contar las líneas puedes usar el counter de líneas del loop: en el código 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 página 1 mostrarías las líneas de 1 a 5; la página 2 puedes hacerla pasando una variable mediante $_GET para que empiece a contar en el resultado 5.

      Si tienes dudas sobre cómo pasar variables mediante $_GET puedes consultar el post Cómo pasar variables de una página a otra en una web con PHP.

      Saludo

    • Por Alex •

    Buenas tardes, muchas gracias por el código 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 validación de usuarios con su ID y su Password o su respectivo registro. La validación de usuarios y registros ya lo tengo realizado pero Cómo puedo hacer para validar la información del archivo .txt y modificar los datos específicos del usuario que haya iniciado sesión?
    Si me pueden colaborar con ello estaré muy agradecido.
    Saludos

  1. Hola Alex,

    si el usuario inicio sesión con un formulario tienes sus datos en la variable global de php $_POST o $_GET, según el method que usó el formulario. Una vez que tienes los datos de sesión 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.

    También puedes guardar los datos de sesión en una cookie. Esto te sirve para tenerlos siempre disponibles.

    • Por MIQUEL BORDERA SALADIE •

    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, añadire 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.

    Un saludo.

    Miquel Bordera

    • Por Aaron Lugo •

    Hola

    Alfonso Sánchez Uzábal, aka skotperez

    Me ah sido de mucha utilidad tu post eh añadido 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.

    1. Hola Aaron,

      para hacer búsquedas en una base de datos de este tipo, contenido en un archivo de texto plano, puedes usar el método que comenta Miquel en los comentarios.

      De manera más ineficiente, aunque eficaz también, puedes hacer un loop con foreach y una sentencia condicional que haga lo que quieras cuando la vuelta del loop contenga lo que estás buscando, por ejemplo «Luis».

    • Por MIQUEL BORDERA SALADIE •

    Hola de nuevo:

    Ahora mismo estoy trabajando en un proyecto para desarrollar una agenda para citas medicas. Despues de pensarlo bastante y estudiar las diferentes formas de hacerlo, lo que voy a hacer es agrupar cada dia en una tabla de citas y cada tabla quedara guardada en un archivo de texto de la forma citas_fecha.dat (por ejemplo citas_20140913.dat, para las citas del dia 13 de septiembre de 2014.

    El hacerlo de esta forma hace que se pueda acceder a las citas de un dia concreto de forma casi instantanea y sin la complegidad que entraña crear una unica tabla global para todas las citas. Al usuario todo esto le es transparente, pues la creacion y acceso de estos archivos de tablas de texto las realiza el propio programa.

    En este caso como los archivos (las tablas) son de pequeño tamaño al contener solo citas de un solo dia (tirando por lo alte en un dia podriamos tener 100 citas como mucho) no hace falta realizar ninguna busqueda por biseccion, ni siquiera que esten ordenadas ni nada. Simplemente se abre el archivo, se carga la tabla completa en un array y luego se procesa segun las necesidades del usuario. Luego si el usuario decide modificar, añadir o eliminar una cita, simplemente se reescribe el archivo completo y listos.

    Si deseamos buscar una cita en un rango de fechas, simplemente lo que haremos sera abrir de forma secuencial los archivos pertenecientes al rango de fechas deseado y buscar las citas que nos interesan).

    Un saludo.

    Miquel Bordera

  2. Buenos días.

    Justo me encuentro en la situación de decidir para mi propia web si utilizar una base de datos para gestionar los contenidos o guardarlos en ficheros de texto.

    La solución sin-base de datos me parece muy interesante, aparte de la posibilidad de economizar el coste del alojamiento si, definitivamente me aseguro de no necesitar una base de datos.

    Pero, aparte de opiniones más o menos subjetivas, aún no he encontrado ninguna comparativa sobre los tiempos de acceso a los ficheros en disco y los tiempos de acceso a los contenidos en una base de datos, aunque sí mucha teoría sobre el proceso mecánico de acceder a los datos.

    Entiendo que semejante comparativa tal vez no exista, sobre todo teniendo en cuenta las muchas variables que puede implicar. Pero, ¿conocéis alguna fuente que sirva de ayuda en esto?

    Saludos a todos.

    1. Hola Enrique,

      no conozco esa comparativa, pero para mí es una cuestión de:

      • el tamaño. Si tu base de datos no es muy grande (los registros no superan los tres dígitos) puedes funcionar con base de datos en archivos de texto. Si es mayor es más eficiente una base de datos estilo SQL.
      • el tipo de consultas que necesites.
      • Este hilo de stackoverflow contiene algunas reflexiones interesantes.

    • Por Daniel

    Un buen post a seguir para montar un sistema web sin sql. Añadir que existen cms desarrollados y activos sin sql:
    get-simple.info
    Kirby
    Stacey
    blitzhive.com

    Enhorabuena por el blog

    1. Hola Daniel,

      sí, desde hace un tiempo creo que son una manera muy válida de montar y mantener una pequeña web o un blog.

      Nosotros hemos desarrollado simplitt con esta idea.

    • Por Daniel Zylberberg •

    Otra cosa que podrías usar es crear varios archivos por separado para que sea más rápido parsearlo y acceder a los datos en vez de recorrer todo el archivo para poner el puntero.

    También se puede usar un objeto, es decir json_encode de php para pasar un array y ese array lo grabás en un txt con file_put_contents.

    Despues lo levantás con file_get_contents y le hacés un json_decode.

    Hay alternativas muy buenas que ya hacen eso, como sqlite, que es una base de datos liviana, donde compiás el archivito sqlite en alguna carpeta, y lo usás casi como mysql.

    Tiene cerca de 300.000 pruebas automatizadas y es muy robusto, php lo soporta por defecto, no necesitás instalarle nada.

    Si el archivo se corrompe, te lo arregla, si la codificacion es diferente, lo estandariza y varias cosas asi.

    Eso se usa en varios reproductores de audio para guardar los playlist, no solamente en php, incluso en apps de android.

    Aparte soporta querys como select now(), valores por defaut y cosas asi que son muy útiles.

    1. Gracias por el aporte Daniel. Efectivamente SQLite es una muy buena alternativa a MySQL ya que es más ligera, y a trabajar con archivos de texto plano «a pelo», como explico en el tutorial, porque ya tienes todo el sistema montado.

  3. he buscado esto por mucho tiempo y me alegro que a todos les funcione pero a mi no me funciona y lo necesito. logico, se que estoy hacienda algo mal, pero no se lo que es o no se si hay que colocarlo dentro una estructura html especifica.

    1. Hola Edwin,

      con algún detalle más sobre dónde estás teniendo los problemas quizás te podamos ayudar.

    • Por Elvin

    Hola, espero puedan ayudarme, soy nuevo programando con archivos, tengo un proyecto que hacer, debo hacer una planilla electrónica en java(tipo excel), una vez que el usuario hizo algo en la plantilla, debo guardar toda la plantilla en disco (pienso usar un JTable), para poder recuperar despues. mi duda es, como podria almacenar los datos del JTable en disco, ya que pueden contener numeros, como string’s, Se supone que debo usar estructuras como, Listas, Pilas o Colas, depende de mí. Espero puedan guiarme un poco en esto, gracias.

    1. Hola Elvin, tu pregunta se escapa del tema que tratamos en este artículo. Te sugiero que busques en webs o foros especializados en java.

    • Por Diana •

    Hola que tal vi tu articulo, me intereso ya que estoy entrando en este tema, me gustaria saber como podría hacer para eliminar o modificar un dato ingresado en el archivo txt

    • Por MIQUEL BORDERA SALADIE •

    Hola:

    El método para modificar un dato en un archivo TXT vendrá determinado por el tamaño del archivo y/o por so conocemos algo de su estructura.

    Si el archivo no es muy grande y se puede leer y cargar en la memoria pues hacemos esto. Lo leemos entero, por ejemplo cargándolo en un array, luego modificamos lo que queramos y lo sobreescribimos completamente. Yo diría que este método es valido, teniendo en cuenta la capacidad de los actuales ordenadors, para archivos de unos cuantos centenares de Kbytes.

    Si el archivo es muy pesado, y para evitar sobrecargar la RAM del ordenador, lo que puedes hacer es leer el archivo hasta el punto que deseas modificar y a la vez escribir lo que vas leyendo en un archivo temporal en el disco duro. Luego, en ese punto añades en el archivo temporal la informacion que has modificado, y a continuación continuas escribiendo en el archivo temporal el resto de la información del archivo original que no has modificado. Luego finamente borras el archivo original y al archivo temporal le pones el nombre del archivo original.

    La linea que separa un método u otro vendrá determinada por el lenguaje de programación/entorno que utilices y la capacidad de tu ordenador. El primer método es mas simple y rápido e incluso puedes usarlo en archivos que excedan de la RAM si el lenguaje o el entorno de desarrollo utiliza eficientemente la memoria virtual y soporta arrays de tan gran tamaño, aunque en tal caso el proceso tomará mas tiempo.

    Una tercera opción es conocer de antemano la estructura del archivo de texto y el punto exacto dentro del archivo donde está la información que quieres modificar/eliminar. En este caso será posible sobreescribir directamente en el archivo original la información nueva por la vieja colocando el puntero del fichero en la posición adecuada. Este método es muy eficiente y muy rápido, pero si no se hace bien puedes sobreescribir información que no debía ser borrada si lo que vas a poner tiene más carácteres que el fragmento original. O por el contrario, a lo mejor tendrás que añadir carácteres redundantes, tales como espacios en blanco, en el caso que el nuevo fragmento de texto sea más corto que el original. Por ello este tercer método no siempre será valido.

    Un saludo.

    Miquel Bordera

    1. Gracias de nuevo Miquel por otra completísima y clara explicación.

    • Por Victor •

    Hola,
    Tengo 15GB de archivos pdf y cuiero hacer un site para venderlo como material dscargable ,tengo un hostin con hostgator el plan baby como debo hacer la base de datos ?

    1. Ha Victor, depende de muchas cosas: de tus conocimientos, del tipo de datos…

      Te diría que lo más fácil y versátil es que empieces con un gestor de contenidos. Así no te tienes que preocupar de la base de datos porque ya viene preparada. WordPress es una buena opción.

    • Por Muy interesante !! •

    Efectivamente el mismo tutorial lo vi en Perl hace muchos años, nunca lo pude implementar porque no profundise en programacion, aunque amo el mundo del software, linux, bsd, etc …
    Pero aprovecho a compartir una inquietud de toda mi vida y que asta el dia de hoy no pude resolver:
    Necesito guardar fragemtos breves de texto plano (información copy paste) y etiquetarla de varias maneras, fechas, fuente, palabras clave, titulo, etc, para luego recuperarla a través de las etiquetas, quiero algo muy sencillo que me permita guardar miles de fragmentos de información, tiene que ser algo que tenga una curva de aprendizaje breve y sencilla, y de ser posible, que sea un programa que ya exista. Un gran saludo y desde ya muchas gracias. Claudio

    1. Hola Claudio,

      el método que describo en el artículo te puede servir. Puedes guardar tus registros en un archivo CSV (que puedeseditar cómodamente con cualquier editor de hojas de cálculo). Luego puedes leer el archivo CSV con PHP, tal como se explica en el artículo, y filtrar por la columna que quieras para mostrar los resultados, que en tu caso sería la columna de la etiqueta.

    • Por jorge aguilar •

    hola!! tengo una duda de como hacer un boton de busqueda para encontrar un txt y que ese txt mandarlo a una tabla de html.

    1. Hola Jorge, ¿buscar un txt o dentro del contenido de un txt? Danos más detalles sobre tu problema y quizás podamos ayudarte.

    • Por Fabricio •

    Hola! la verdad que me sirve de mucho la tabla…. la base de dato la armo con javascript mediante un programa de chat, me gustaria hacerla en PHP pero la verdad que me cuesta mucho… me podrias dar una idea de como hacerlo a la inversa? que una tabla me cree el archivo .txt
    Desde ya muchas gracias, busque mucho algo asi de sencillo!
    Saludos y gracias por compartir !

    1. Hola Fabricio,

      el artículo cuenta cómo leer un archivo de texto. Para poder escribir en un archivo de texto debes invocar fopen en modo escritura (w):

      $fp = fopen('contactos.txt','w');

      De esta manera puedes hacer las consultas necesarias a tu base de datos, y escribir la tabla en el archivo de texto.

    • Por Alexander •

    Buenas espero y me puedan ayudar en esta aplicación q estoy desarrollando en PHP para a mi trabajo.
    La idea es que quiero saber de qué manera validar los datos cargo en un archivo de texto por ejemplo
    1 Que valide que todos los registros cumplan con el número de campos.
    2 que cada campo tenga sus valores permitidos
    3 hay unos campos que se validan con otros campos, ejemplo si tengo en el campo embarazada el número 1 que quiere decir que esa usuaria esta embarazada por tal motivo debo validar que el campo de sexo debe ser femenino y el campo edad debe ser mayor a 12 años y menor de 60 años.

    Espero me puedan entender y ayudar.

    • Por Nimrod

    Para mi este es mucho mejor: https://www.youtube.com/watch?v=Rn1zMmy5WfM por que no usa un solo archivo de texto y hasta tiene mejor estructura

    • Por HULS •

    Buenas, revisando los aportes y el codigo, tengo una inquietud.
    Estoy manejando unos archivos .txt y estoy tratando de realizar un programa para que me revice esos archivos realizando de paso unas modificaciones tales como quitar ceros a la izquierda unir palabra entre otros, hay alguna forma de subirlos y descargarlos en el mismo formato?

    1. ¿Subirlos a dónde, descargarlos de dónde?

        • Por HULS •

        Quiero subirlos a una base de datos, donde me realice una serie de procedimientos según la opción que escoja y los descargar nuevamente en formato .txt con las modificaciones echas.

    2. Hola HULS,

      si necesitas hacer operaciones típicas de una base de datos, quizás no te interesa trabajar con archivos de texto plano, sino con una base de datos directamente. Desde el servidor de base de datos puedes exportar a un archivo de texto si lo necesitas.

      En cualquier caso para insertar registros en una base de datos, registros que tienes en un archivo de texto plano, digamos en formato CSV, tienes que crear las consultas para realizar los inserts con PHP.

      Luego puedes hacer la operación inversa: lanzar las consultas de lectura a la base de datos y escribir las respuestas en un archivo txt, usando el método que se explica en este post.

    • Por daniel •

    una pregunta como puedo hacer un login con esto ? soy nuevo programando

    1. Hola Daniel,

      para hacer un login necesitas tener una base de datos de usuarios (en este caso un archivo de texto plano), consultarla en el momento en el que un usuario intenta iniciar sesión (usando PHP por ejemplo) y si las credenciales coinciden, darle acceso como usuario registrado.

      Alojar datos de usuario, sobre todo contraseñas, en archivos de texto plano no es siempre recomendable. Hay que tener cuidado por motivos de seguridad. Pero se puede hacer.

      La recomendación a seguir es utilizar un spodríaistema asimétrico para guardar las contraseñas usando un algoritmo de hashing. De esta manera aunque alguien acceda al archivo con la información del usuario no obtendría las contraseñas. En PHP tienes la función password_hash para manejar un sistema de contraseñas siguiendo esta lógica.

    • Por DAMIAN •

    CONSULTA: tengo una tabla de 10×10 (la puedo dejar en xlm,bin, dbi o txt)
    en una unidad de red , este archivo se actualiza solo cada 5 minutos.
    y en mi compu tengo instalado xampp como podria mostrar esa tabla en mi explorador . he hecho el codigo en html y php con refresh para que se actualice y file\\\: para la ubicacion del archivo. pero no consigo mostrar nada.
    Me podran ayudar?? desde ya muchas gracias

    1. Hola Damian,

      tu pregunta se escapa del tema de este artículo. Pero ahí va una idea: en sistemas Linux puedes montar el disco remoto en tu máquina local usando nfs y mostrarlo en tu navegador como si fuera un archivo local.

      También puedes conectarte a la unidad en red usando ssh o ftp.

    • Por Samuel

    Hola tengo una consulta: utilizando el opendir hay alguna forma de mostrar un limite de archivos? es decir, del archivo 4 al 9 por ejemplo ya que en un sistema SQL seria utilizando en un select simplemente añadiendo LIMIT 4,9 pero con opendir no se como limitar la cantidad de archivos a ver de forma personalizada,

    Saludos, gran articulo

    • Por Miquel Bordera •

    Carga el listado de archivos en un array y luego muestra solo los elementos que quieras

    • Por wilmer G •

    saludos y tendrías un código de creación del archivo inserción de registros nuevos , consulta general e individual de un registro, edición de un registro y eliminación de un registro

    • Por MIQUEL BORDERA •

    Hola wilmer G.

    Yo estas operacones que comentas las realizo en Perl utilizando los las funciones de puntero de archivo print, seek, tell y read. Te voy a poner un ejemplo.

    Supongamos que tenemos un archivo que ya existe llamado miarchivo.txt, del cual sabemos que su estructura esta basada en registros de 400 caracteres.

    Abrimos el archivo en modo loectura(escritura:y le asociamos el identificador ARCHIVO (por poner un ejemplo)
    open(ARCHIVO,»+>miarchivo.txt»);

    Si lo que queremos es leer el registro 2500, lo que haremos es determinar primero la posicion real donde se encuentra el inicio de este registro:
    $posicion = 2512*400 = 1004800;

    Ahora ponemos el puntero del archivo en esa posicion mediante la funcion seek
    seek(ARCHIVO,$posicion,0);

    Ahora podemos hacer dos cosas:
    O bien podemos leer el registro con la funcion read y asignar el contenido del registro a la variable $registro de la siguiente forma
    read(ARCHIVO,$registro,400);
    O bien podemos sobreescribir el contenido del registro con el contenido de la variable $regitro con la funcion print
    print ARCHIVO $registro;
    Téngase en cuenta que después de escribir o leer, el puntero del archivo se incrementa el numero de caracteres que hayamos escrito o leido.
    La funcion tell(ARCHIVO) simplemente devuelve el valor de la posicion actual del puntero dentro del archivo.

    Lo que comentas de borrar el contenido de un registro con estas funciones no es posible, y en principio tampoco debería ser necesario. Yo cuando quiero «borrar» un registro simplemente lo que hago es marcarlo como «borrado» en un campo del registro destinado a tal fin. Luego, si se diera el caso que tuvieras un archivo muy grande con un muy elevado numero de registros marcados como borrados lo que debes hacer es crearte una pequeña rutina que reescriba todo el archivo eliminando los registros borrados, aunque realmente hasta la fecha para mis fines no me ha hecho falta. Tambien puedes crearte una estructura que te permita reutilizar archivos marcados como borrados. Es cuestion de darle a la imaginación para explotar las grandes posibilidades de estas funciones.

    Si tienes un archivo muy grande y alguno de los campos de los registros sabes a ciencia cierta que esta ordenado de forma creciente o decreciente (numerica o alfanumericamente) puedes utilizar estas funciones para realizar una búsqueda por bisección y acceder de forma muy rápida a cualquier registro.

    Espero que te haya servido de utilidad. En PHP y en la mayoria de lenguajes de programación encontraras funciones parecidas a estas.

    • Por MIQUEL BORDERA •

    CORRECCION MENSAJE ANTERIOR

    Donde pone:
    Si lo que queremos es leer el registro 2500, lo que haremos es determinar primero la posicion real donde se encuentra el inicio de este registro:
    $posicion = 2512*400 = 1004800;

    Debe poner
    Si lo que queremos es leer el registro 2512, lo que haremos es determinar primero la posicion real donde se encuentra el inicio de este registro:
    $posicion = 2512*400 = 1004800;

    • Por Cristian •

    Me sale este error cuando utilizo la variable $field[$loop][1]. La estoy intentando implementar en mi propio programa de la siguiente forma:
    if ($field[$loop][1] == ‘Vila’) { ………

    Undefined offset: 1 in

    1. Hola Cristian,

      ese error significa que en la matriz $loop no existe el elemento 1. Haz un var_dump, por ejemplo, de la matriz para ver qué contiene.

        • Por Cristian •

        Ok, gracias.

  4. Buenas, será que estás disponible para colaborarme con un script, lo tengo a medias pero no consigo reemplazar unas variables y es un poco especial el script.
    Basicamente es,
    Leer 2 ficheros (uno con 6 palabras separadas por ; ) y otro con un texto el texto tendrá 6 variables.
    – Las 6 palabras del primer fichero txt se deben reemplazar por las variables del texto.
    El script debe generar el mismo texto con cada una de las 6 palabras.
    Si elegimos la palabra4, al reemplazar se tendrá que elegir la palabra3 y palabra2 (es decir restar -1 y -2) para ubicarlas en otros puntos.

    Es un poco dificil de explicar pero no es tan complicado, pero con el script no doy, solo he podido tener la parte de lectura con fread y almacenado las variables pero no logro reemplazar las keywords con las variables y mucho menos el orden de -1 y -2 .

    Espero puedan colaborarme, gracias!

    1. Hola J Montoya,

      tu consulta se sale del tema que trata este artículo. Con los datos que das diría que con awk lo puedes hacer con un par de líneas de código. Hay mucha documentación, por ejemplo aquí se explica cómo usar awk con archivos CSV, que entiendo es tu caso.

  5. Hola skotperez, gracias por responder, me leeré la información que me facilitas, de momento no logre exactamente lo que necesitaba, pero si otra forma de modificar las variables a lo largo del texto, usando dos array uno para cada zona de palabras, y una vez pasado ese ítem por el foreach lo resto con la función de unset, y luego genero el array aleatorio así nunca se repiten las keywords en resto de posiciones.
    Muchas gracias, me ha gustado mucho tu blog es bastante curioso lo tendré al tanto. Sería bueno tengas un newsletter donde registrarnos para recibir notificaciones cuando escriben en post blog.

    • Por Ema

    Buenas me que gustaría saber si tienes alguna referencia de como funcionaria un archivo plano para un login en Android Studio de ante manos gracias.

    • Por Jorgeleitor •

    Hola
    Inicialmente saludarle y gracias por compartir…Hace años trabaje con una web completamente escrita en Perl y usaba archivos txt como base de datos…no un archivo si no varios y Perl ( no me preguntes cómo) los relacionaba entre sí.

    La verdad era una web muy rápida y funcionó correctamente durante muchos años…luego llegó la revolución WordPress y quedé atrapado y maravillado por el mundo PhP… En programación se pueden hacer muchas cosas. Yo ando ahora con dos temas webscraping con Python y un servidor de scripts mediante archivos TXT…. Coger texto, formatearlo según corresponda y lanzarlo al espacio sideral…y por este último acabe leyendo tu blog… Solo felicitarte por tu trabajo y excelente blog. Saludos.

    • Por León •

    Hola, un saludo cordial,

    De antemano, gracias por compartir su conocimiento en este artículo.

    He intentado darle un uso a su explicación y he llegado hasta el punto en el que mi navegador me muestra el mensaje de error:

    «An uncaught Exception was encountered
    Type: TypeError

    Message: Cannot increment resource»

    El error se presenta justo por la línea donde se encuentra la siguiente instrucción:

    $fp++; // necesitamos llevar el puntero del archivo a la siguiente línea

    Como resultado, en el archivo abierto solo se aprecia la primera línea, el resto no aparece.

    ¿Alguna idea sobre a qué se debe este error?

    Mil gracias!

×

Responder al comentario de Elvin

*
*

 

No hay trackbacks