Foros del Web » Programando para Internet » PHP »

Indicar en que linea esta cada palabra...

Estas en el tema de Indicar en que linea esta cada palabra... en el foro de PHP en Foros del Web. Hola, necesito hacer un script que abra un archivo y le devuelva al usuario un listado de las palabras que aparecn en el texto... (sin ...
  #1 (permalink)  
Antiguo 10/06/2005, 13:19
 
Fecha de Ingreso: julio-2004
Mensajes: 194
Antigüedad: 19 años, 9 meses
Puntos: 1
Indicar en que linea esta cada palabra...

Hola, necesito hacer un script que abra un archivo y le devuelva al usuario un listado de las palabras que aparecn en el texto... (sin que se repitan las palabras) y el numero de la o las lineas donde aparece la palabra. si aparece 2 o mas veces en una linea que solo se meustre una sola ves el numero.

Para esto diseñe el siguente codigo pero que no funciona muy bien ya que en algunos casos algunas palabras no aparecen y otras sale repetidas.

Les muesto el codigo a ver si me pueden hechar una mano...

Código PHP:
<?php
  
if($_POST[action]){

       
$file "texto.txt";
       
$fp fopen($file,'r');


       
$texto fread($fpfilesize($file));

       
$line=explode("\n",$texto);

       
$words=array_unique(explode(" ",$texto));

    for(
$k=0$k<=count($line); $k++)
        
$text[$k]=explode(" ",$line[$k]);


      for(
$n=0$n<=count($words); $n++){
          
$band=true;
        for(
$l=0$l<=count($text); $l++){

           for(
$p=0$p<count($text[$l]); $p++){



                 if(
$words[$n]==$text[$l][$p] &&$words[$n]!="" ){


                    if(
$band==true){
                       
$return .= $words[$n].": ".($l+1);
                       
$band=false;
                      }
                       else
                         
$return .= " ,".($l+1);

                     }
                 }
             }
         
$return .="\n";

         }
     }
?>
la idea consiste en abrir un archivo, usar un explode y un \n para crear un array donde cada casilla es una linea del texto... despues explorar de nuevo cada linea y colocar en un arreglo adicional un array por casilla que contiene cada palabra corresoindiete a la linea...

Espero entieda lo que necesito, la forma en que lo codifique y me puedan ayudar a corregirlo.

Saludos, y gracias de antemano y perdon por la mala ortografia y redaccion... ayudado por fallas del teclado :P
__________________
"Hay Algo Activo en el piso de Abajo..."

K-Seraph Blog
  #2 (permalink)  
Antiguo 26/06/2005, 10:03
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Es interesante el problema que planteas. La solución que has desarrollado parece ser efectiva, no he visto los problemas que mencionas (palabras que no aparecen o aparecen repetidas), tan solo un ligero problema con los saltos de línea, y un par de detalles que me llaman la atención de tu implementación:
  • Las variables usadas hacen uso de una cantidad considerable de memoria. La variable $texto almacena el texto completo del archivo, la matriz $line almacena todas las líneas, la matriz $words almacena todas las palabras únicas, y la matriz $text almacena todas las palabras de cada línea. Como podrás imaginar, entre más grande sea el archivo de entrada, el consumo de memoria será considerablemente mayor.
  • El algoritmo contiene un ciclo principal con una complejidad O(m * n * o) en donde m es el número de palabras del archivo, n el número de líneas y o el número de palabras por línea. Me parece que vale la pena buscar alguna alternativa que reduzca este valor.

Mi propuesta para el problema sería algo como esto:

Código PHP:
$archivo 'texto.txt';

$da fopen ($archivo'r');

$resultados = array ();
$num_linea  0;

while (! 
feof ($da)) {
    
$num_linea++;
    
$linea fgets ($da);

    
$palabras array_unique (preg_split ('/\\s+/'$linea, -1,
                                          
PREG_SPLIT_NO_EMPTY));

    foreach (
$palabras as $palabra) {
        if (! isset (
$resultados[$palabra])) {
            
$resultados[$palabra] = array ($num_linea);
        } else {
            
$resultados[$palabra][] = $num_linea;
        }
    }
}

fclose ($da)

// Ordenar resultados
ksort ($resultados);

// Recolectar resultados en un bufer
$return '';
foreach (
$resultados as $palabra => $lineas) {
    
$return .= "{$palabra} : " implode (', '$lineas) . "\n";

No lo he probado exhaustivamente pero parece trabajar bien. Quizás te resulte útil en tu script.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:55.