Foros del Web » Programando para Internet » PHP »

Solo me lee la última linea funtion_file()

Estas en el tema de Solo me lee la última linea funtion_file() en el foro de PHP en Foros del Web. Tengo un código tal que así: Código PHP: <? $patron  =  '/^\{.*\{([0-9]+)\}.*\}$/' ; $myfile  =  "prom.log" ; $lines  =  file ( $myfile );     for( $i ...
  #1 (permalink)  
Antiguo 23/08/2010, 15:33
 
Fecha de Ingreso: febrero-2003
Mensajes: 763
Antigüedad: 21 años, 1 mes
Puntos: 2
Solo me lee la última linea funtion_file()

Tengo un código tal que así:

Código PHP:
<?

$patron 
'/^\{.*\{([0-9]+)\}.*\}$/';

$myfile "prom.log";

$lines file($myfile);    
for(
$i=count($lines);$i>0;$i--){
    
$datos $lines[$i];
    
$id = array();
    
preg_match($patron$datos$id);
    echo 
$id[1];
}
?>
el proposito de este programa es imprimir solo el valor que hay entre el antepenúltimo corchete

El fichero prom.log es algo así:

{PROM}{}{dato1}{dato2}{dato3}{\{dato4\}}{dato5}{da to6}{1}{dato7}{}
{PROM}{}{dato1}{dato2}{dato3}{\{dato4\}}{dato5}{da to6}{2}{dato7}{}
{PROM}{}{dato1}{dato2}{dato3}{\{dato4\}}{dato5}{da to6}{3}{dato7}{}
{PROM}{}{dato1}{dato2}{dato3}{\{dato4\}}{dato5}{da to6}{4}{dato7}{}

me imprime: solo el ultimo dato "4" y yo quiero que me imprima: 1234

¿porque ocurre esto?

Gracias

Saludos

Última edición por escan_0; 23/08/2010 a las 15:39
  #2 (permalink)  
Antiguo 23/08/2010, 22:17
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Solo me lee la última linea funtion_file()

Trata de esta forma
Código PHP:
Ver original
  1. <?php
  2. $patron = '/\{([0-9]+)\}/';
  3. $myfile = "prom.log";
  4. $lines = file($myfile);    
  5.  
  6. for($i=0; $i<count($lines); $i++){
  7.     $datos = $lines[$i];
  8.     $id = array();
  9.     preg_match($patron, $datos, $id);
  10.     echo $id[1];
  11. }

Edito:
Creo que la mejor forma es esta
Código PHP:
Ver original
  1. <?php
  2. foreach(file('prom.log') as $row){
  3.     preg_match('/\{([0-9]+)\}/', $row, $id);
  4.     echo $id[1];
  5. }
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 28/08/2010, 10:50
 
Fecha de Ingreso: febrero-2003
Mensajes: 763
Antigüedad: 21 años, 1 mes
Puntos: 2
Respuesta: Solo me lee la última linea funtion_file()

Perdon por la tardanza, he probado el código y el problema parece que se ha solucionado pero en vez de coger el antepenúltimo dato muestra el cuarto por el principio:

{PROM}{}{}{AHORA_COGE_ESTE}{datos}{\{datos\}}{dato s}{datos}{QUIERO_ESTE_DATO}{}{}

Gracias
  #4 (permalink)  
Antiguo 04/09/2010, 02:06
 
Fecha de Ingreso: febrero-2003
Mensajes: 763
Antigüedad: 21 años, 1 mes
Puntos: 2
Respuesta: Solo me lee la última linea funtion_file()

Debe de ser algun error en la sintaxis del patron pero no acabo de entenderlo
  #5 (permalink)  
Antiguo 04/09/2010, 02:10
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Solo me lee la última linea funtion_file()

En el ejemplo que haz dado, me sale lo que quieres, solo coloca en el ejemplo un archivo llamado prom.log y coloca esta información solamente
Código log:
Ver original
  1. {PROM}{}{dato1}{dato2}{dato3}{\{dato4\}}{dato5}{da to6}{1}{dato7}{}
  2. {PROM}{}{dato1}{dato2}{dato3}{\{dato4\}}{dato5}{da to6}{2}{dato7}{}
  3. {PROM}{}{dato1}{dato2}{dato3}{\{dato4\}}{dato5}{da to6}{3}{dato7}{}
  4. {PROM}{}{dato1}{dato2}{dato3}{\{dato4\}}{dato5}{da to6}{4}{dato7}{}
Luego en el php solo coloca este código
Código PHP:
Ver original
  1. <?php
  2. foreach(file('prom.log') as $row){
  3.     preg_match('/\{([0-9]+)\}/', $row, $id);
  4.     echo $id[1] . '<br />';
  5. }
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 05/09/2010, 04:51
 
Fecha de Ingreso: febrero-2003
Mensajes: 763
Antigüedad: 21 años, 1 mes
Puntos: 2
Respuesta: Solo me lee la última linea funtion_file()

Es verdad con esa estructura que pase si funciona perfectamente, exactamente esta es la estructura verdadera:

{GSMSMS}{}{}{dato1}{dato2}{\{dato3\}}{dato4}{dato5 }{1}{}{}
{GSMSMS}{}{}{dato1}{dato2}{\{dato3\}}{dato4}{dato5 }{2}{}{}
{GSMSMS}{}{}{dato1}{dato2}{\{dato3\}}{dato4}{dato5 }{3}{}{}


Comparandola con la que yo pase tiene algunas diferencias:

{PROM}{}{dato1}{dato2}{dato3}{\{dato4\}}{dato5}{da to6}{1}{dato7}{}
  #7 (permalink)  
Antiguo 10/09/2010, 11:53
 
Fecha de Ingreso: febrero-2003
Mensajes: 763
Antigüedad: 21 años, 1 mes
Puntos: 2
Respuesta: Solo me lee la última linea funtion_file()

no entiendo muy bien la sintaxis del patron y no encuentro la solución...
  #8 (permalink)  
Antiguo 10/09/2010, 12:17
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Solo me lee la última linea funtion_file()

Pero cuál dato quieres porque lo que hace la expresión es solamente tomar los valores que estén en {#}.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #9 (permalink)  
Antiguo 10/09/2010, 13:51
 
Fecha de Ingreso: febrero-2003
Mensajes: 763
Antigüedad: 21 años, 1 mes
Puntos: 2
Respuesta: Solo me lee la última linea funtion_file()

el valor 1, 2, 3... que hay en el antepenúltimo corchete, al parecer puse un patron incorrecto, este es el correcto:

{GSMSMS}{}{}{dato1}{dato2}{\{dato3\}}{dato4}{dato5 }{1}{}{}
{GSMSMS}{}{}{dato1}{dato2}{\{dato3\}}{dato4}{dato5 }{2}{}{}
{GSMSMS}{}{}{dato1}{dato2}{\{dato3\}}{dato4}{dato5 }{3}{}{}

para mostrar un resultado tal que así: 123
  #10 (permalink)  
Antiguo 10/09/2010, 14:09
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Solo me lee la última linea funtion_file()

Sigo diciendo que funciona lo que te di. Mira este ejemplo con lo que escribiste
Código PHP:
Ver original
  1. <?php
  2. $str = '{GSMSMS}{}{}{dato1}{dato2}{\{dato3\}}{dato4}{dato5 }{1}{}{}
  3. {GSMSMS}{}{}{dato1}{dato2}{\{dato3\}}{dato4}{dato5 }{2}{}{}
  4. {GSMSMS}{}{}{dato1}{dato2}{\{dato3\}}{dato4}{dato5 }{3}{}{}';
  5. preg_match_all('/\{([0-9]+)\}/', $str, $m);
  6. foreach($m[1] as $v){
  7.     echo $v;
  8. }
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #11 (permalink)  
Antiguo 11/09/2010, 09:05
 
Fecha de Ingreso: febrero-2003
Mensajes: 763
Antigüedad: 21 años, 1 mes
Puntos: 2
Respuesta: Solo me lee la última linea funtion_file()

La verdad es que estoy un poco extrañado, yo utilizo su codigo:

Código PHP:
$patron '/\{([0-9]+)\}/';
$myfile "failed.sms";
$lines file($myfile);

for(
$i=0$i<count($lines); $i++){
    
$datos $lines[$i];
    
$id = array();
    
preg_match($patron$datos$id);
    echo 
$id[1];
}

?> 
y el archivo: failed.sms es el siguiente:

{GSMSMS}{}{}{611111111}{mensaje1}{\{663459D7-DDDB-4FC4-A2FC-D3F66908E4E2\}}{Credits: 99}{sms}{1}{}{}
{GSMSMS}{}{}{611111111}{mensaje2}{\{B834F99F-CA47-4B42-B00D-D472E445411D\}}{Credits: 99}{sms}{2}{}{}
{GSMSMS}{}{}{611111111}{mensaje3}{\{BA993668-EB18-48DA-8EEF-4BBEEA890FC9\}}{Credits: 99}{sms}{3}{}{}
{GSMSMS}{}{}{611111111}{mensaje4}{\{6F505F4D-5780-42E3-B2A9-6C9F5F772101\}}{Credits: 99}{sms}{4}{}{}
{GSMSMS}{}{}{611111111}{mensaje5}{\{A63ADDA9-9A6A-48B7-B37A-2A39600111F0\}}{Credits: 99}{sms}{5}{}{}
{GSMSMS}{}{}{611111111}{mensaje6}{\{A63ADDA9-9A6A-48B7-B37A-2A39600111F0\}}{Credits: 99}{sms}{6}{}{}

y me muestra el siguiente el resultado:

61111111161111111161111111161111111161111111161111 1111

en vez de 123456, no se que puede pasar...
  #12 (permalink)  
Antiguo 11/09/2010, 09:25
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Solo me lee la última linea funtion_file()

La razón es que la expresión regular detecta si son números solamente y muestra el resultado. El problema contigo es que tienes dos campos numéricos. Para ello vas a tener que añadir otra parte para que tome exactamente lo que quieres, por ejemplo
Código PHP:
Ver original
  1. <?php
  2. $str = '{GSMSMS}{}{}{611111111}{mensaje1}{\{663459D7-DDDB-4FC4-A2FC-D3F66908E4E2\}}{Credits: 99}{sms}{1}{}{}
  3. {GSMSMS}{}{}{611111111}{mensaje2}{\{B834F99F-CA47-4B42-B00D-D472E445411D\}}{Credits: 99}{sms}{2}{}{}
  4. {GSMSMS}{}{}{611111111}{mensaje3}{\{BA993668-EB18-48DA-8EEF-4BBEEA890FC9\}}{Credits: 99}{sms}{3}{}{}
  5. {GSMSMS}{}{}{611111111}{mensaje4}{\{6F505F4D-5780-42E3-B2A9-6C9F5F772101\}}{Credits: 99}{sms}{4}{}{}
  6. {GSMSMS}{}{}{611111111}{mensaje5}{\{A63ADDA9-9A6A-48B7-B37A-2A39600111F0\}}{Credits: 99}{sms}{5}{}{}
  7. {GSMSMS}{}{}{611111111}{mensaje6}{\{A63ADDA9-9A6A-48B7-B37A-2A39600111F0\}}{Credits: 99}{sms}{6}{}{}';
  8. preg_match_all('/\{sms\}\{([0-9]+)\}/', $str, $m);
  9. foreach($m[1] as $v){
  10.     echo $v;
  11. }
PD: Trata a la próxima colocar lo que estás usando exactamente así se te da una respuesta más adecuada.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #13 (permalink)  
Antiguo 11/09/2010, 11:53
 
Fecha de Ingreso: febrero-2003
Mensajes: 763
Antigüedad: 21 años, 1 mes
Puntos: 2
Respuesta: Solo me lee la última linea funtion_file()

Muchisimas gracias!! por sintetizar puse dato1 dato2 y claro no pense en ese problema. Ahora funciona perfectamente

Un Saludos

Etiquetas: linea
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 01:41.