entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Como buscar una cadena de texto dentro de un archivo de muchas lineas?

Hola,

Resulta que tengo un archivo de texto en el servidor con muchas lineas de este tipo:

string1:cualquiercosa1
string2:cualquiercosa2
string3:cualquiercosa3
.
.
.
stringn:cualquiercosan

Lo que tengo que hacer es crear una condición que primero me diga si existe por ejemplo "string17" dentro del archivo, y solo si existe que me devuelva el valor que lo acompaña después de ":" (digamos que sería "cualquiercosa17") y ese dato guardarlo en una variable.

Lamentablemente no encuentro la forma de hacerlo. ¿Alguien la conoce?

Gracias de antemano.

0voto

carlossevi comentado

Mi respuesta iba a ir por el mismo camino que la de @nmenag utilizando expresiones regulares, pero no nos has dicho qué lenguaje de programación estás utilizando para poder ponerte ningún ejemplo.

0voto

ibarragp comentado

Suponiendo que estas programnado en PHP (al menos pusiste ese tag)
Si en lugar de ":" hubiesen sido "=" sería un típico archivo de configuracion de tipo "ini" y podria usarse una función para analizarlo http://php.net/manual/en/function.parse-ini-file.php y que te devuelva los hash con las claves: luego consultando si la clave está en el array y se accede al valor directamente desde la clave.

2 Respuestas

2votos

Leonardo-Tadei Puntos227320

Hola,

no aclarás cuantas son las "muchas líneas" del archivo de texto, ya que puede ser determinante en el proceso.

Si el archivo ocupa menos de 64Kb (lo ideal sería que no supere los 32Kb), podrías hacer algo como:

<?php
$f = file("archivo.txt"); // carga el archivo a un vector
$valores = array();
// recorre el archivo y lo carga a los vectores
foreach($f as $linea){
   $tmp = explode(":", $linea);
   $valores[$tmp[0]] = $tmp[1];
}
// Busca un string
if( array_key_exists("string17", $valores) ) {
   print("La clave string17 vale {$valores["string17"]}");
}

La estrategia es cargar el archivo de texto a un vector y luego buscar en el vector, que es muy eficiente.
También se podría preguntar if(isset($valores["string17"]))

Si el archivo ocupa más de 64Kb, te conviene hacer llamadas al sistema para obtener un subconjunto del archivo y no todo. Dependerá de la plataforma, pero en GNU/Linux podrías hacer algo como:

cat archivo.txt | grep string17

ejecutar el comando con exec() y hacer lo mismo que al principio, pero ahora trabajarás solo con un subconjunto del archivo, que será más rápido.

Si el archivo ocupa 1Mb o más... deberías usar una base de datos!

Saludos!

0voto

HoberMallow comentado

Gracias a todos por responder, en efecto estaba usando PHP, lo que quería en concreto era agregar una especie de protección de dominio (que un elemento del sistema que puede ser embebido solo funcione si se encuentra dentro del dominio que el usuario había especificado previamente).

Entonces en mi servidor, en la página A, si el usuario marca la opción de protección e ingresa el nombre del dominio, entonces, yo la guardo en un archivo de texto junto a un hash único, y en la página B (que es la que puede ser embebida) se verifica si el hash existe, y si existe se verifica si el dominio donde está siendo ejecutado coincide con el mismo del archivo de texto, si coincide pues continua la ejecución del código, sino pues muestra un mensaje y termina.

Había logrado una solución que funcionaba, pero la de Leonardo me parece mejor. Por desgracia en ese entorno no puedo usar bases de datos por el momento, aunque intentaré ver si puedo implementarlo en un futuro.

Muchas gracias a todos.

Editado: movido a comentartio de la respuesta.

2votos

nmenag Puntos3630

Saludos

puede usar expresiones regulares que busque una cadena especifica, una que busque el "string17" y otra que busque los ":"

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta