Foros del Web » Programando para Internet » PHP »

ayudita con ficheros leer-escribir strings

Estas en el tema de ayudita con ficheros leer-escribir strings en el foro de PHP en Foros del Web. Hola buenas, resulta que tengo un txt que quiero leer y dependiendo de si el último caracter de cada línea es un número u otro, ...
  #1 (permalink)  
Antiguo 06/10/2004, 10:02
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 13 años, 7 meses
Puntos: 0
ayudita con ficheros leer-escribir strings

Hola buenas, resulta que tengo un txt que quiero leer y dependiendo de si el último caracter de cada línea es un número u otro, copiar o no esa línea en un fichero temporal.

El fichero con el contenido es de este estilo siempre:

Código:
2004-10-17 Betis - Real Madrid0
2004-10-31 R. Madrid - Getafe0
2004-10-28 ahora concierto<br>salto linea<br>y vuelvo a saltar<br>yeahhhh....frf..1234561
Y el código que no me furula es el siguiente:

Código:
if (file_exists ($data_dir."contenido.txt")){
    $fp = fopen ($data_dir."contenido.txt", "r");
    $fw = fopen ($data_dir."temp.txt", "w");
    while (!feof($fp))
    {
       $str = fgets ($fp, 1024);
       //echo($str);
       //if (strlen ($str) > 10) 
       //{  

           $date_entry = substr ($str, 0, 10);
           $end = strlen($str)-1;
           $end_ch = $str[$end];
           //echo ($end_ch);
           if($end_ch==$p){
              fputs ($fw, $str);
           }
        //}
    }
    fclose($fp);
    fclose($fw);
  }
Como véis hay 3 echos que he usado para probar y sólo da salida el primer echo, dando como salida lo esperado, todo el fichero, por lo que parece que no entra en "if (strlen ($str) > 10" ?¿ ya que los otros dos echos no me dan nada de salida y tampoco se guarda nada en temp.txt

qué está mal??
graciassss

Última edición por apañero; 06/10/2004 a las 10:07
  #2 (permalink)  
Antiguo 06/10/2004, 10:44
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
mm Si en ese archivo de texto plano guardas tus "registros" separados por sálto de línea (/n .. ) con la función file() podrías leer ese registros completo de forma sencilla ya que te arrojaría un array con tantos elementos como "líneas" tiene tu archivo de texto plano.

Por lo demás .. ese "numero" que añades al final de cada "línea" (registro) de tu .txt .. deberías de normalizar un poco mejor el asunto, tal vez usando un caracter tipo | o similar (es uno de los que más se usan) para separa tus "campos" de información de cada "registro" .. así podrías aplicar una función como explode() a ese caracter de separador para obtener otro array con los "campos" y tomar el últimio elemento de ese array que será tu "numero" completamente "limpio" y bien localizado independiente de su longitud en caracteres. Te menciono usar ese tipo de caracter por qué tus "campos" contienen o pueden contener espacios entre otros caracteres .. si no fuese así podrías usar el espacio simplemente .. pero no es tu caso debes usar otro caracter como separador diferente a un espacio o caracter que puedas usar en tu datos.

De esta forma te quedaría algo tipo:

Cita:
2004-10-17|Betis - Real Madrid|0
2004-10-31|R. Madrid - Getafe|0
2004-10-28|ahora concierto<br>salto linea<br>y vuelvo a saltar<br>yeahhhh....frf..|1234561
Y como te menciono . .con file(), explode() o incluso con fgetcvs() te ayudaría a leer mejor ese archivo con ese tipo de estructura.


Un saludo,
  #3 (permalink)  
Antiguo 06/10/2004, 18:17
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 13 años, 7 meses
Puntos: 0
muchas gracias cluster, pero no tengo opción de modificar el archivo con los datos, es como he dicho arriba. Mira a ver qué errores ves en el código anterior que he puesto para ir subsanándolos poco a poco, porque la duda es saber en qué me estoy equivocando.


venga gracias y saludosss
  #4 (permalink)  
Antiguo 07/10/2004, 08:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pero .. al menos sabes si ese "número" del final de cada registro es de cierto formato (longitud en caracteres ..)? .. Existe siempre un espacio u otro caracter antes de ese "número"? ..

Te comento todo esto .. por qué si no hay nada de eso como "norma" es bastante complejo "atinar" a que tu algoritmo siempre funcione (por eso con mi anterior propuesta .. el objetivo era de "normalizar" esos datos).

Lo que pretendo es llegar a ver que formato tiene tu archivo (sus datos) como para ver alguna solución para leerlo .. Personalmente para ese tipo de estructura yo usaría file() en lugar de fgets() para obtener un array y como tal "trabajarla". Además recuera que el fgets() lee los bytes que ahí indiques (1024 en tu caso tienes puesto) .. esa función se usa para leer un archivo entero hacia un string y a tí te interesaría leer esos "registros" por qué con "Cada uno" tienes que hacer X proceso (como ese de obtener tus últimos datos).

Un saludo,
  #5 (permalink)  
Antiguo 07/10/2004, 18:10
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 13 años, 7 meses
Puntos: 0
en mi caso ese número es siempre 1 o 2 o 3, vamos es un número de un díigito, en mi caso solo uso el 1, 2 y 3.

Al texto que es cada linea se le hace:
if (!$allow_html_code)
{
$txt = strip_tags ("$txt");
}
$txt = stripslashes ("$txt");
$txt = trim ($txt);

$txt = str_replace("\r\n", "<br>", $txt);

luego la fecha..... $dtstr = $yr."-".$mn."-".$day;

y al escribir en el archivo txt se hace como:

$temp = $dtstr." ".$txt.$numerito;

fputs ($fp, $temp."\n");

Me he saltado cosas pero eso es lo que me preguntabas, esa es la forma de introducir registros. A ver si ahora me puedes decir en qué fallo y puedo cir avanzando.

muchas gracias por tu ayuda :)
  #6 (permalink)  
Antiguo 08/10/2004, 07:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si generas tu mismo el archivo .. ¿por qué no puedes darle el formato que te comenté usando un caracter característico (como ese |)? .. por lo menos usa un espacio para separar tu "numerito" al final de la cadena o mejor todavía ese caracter de separador ..

De esta forma . .insisto que podrías usar file() para leer tu archivo (registros en sí) y luego irte con explode() por ejemplo (o usando fgetcsv()) hacia el "último" campo de tu "registro" que será ese númerito.

También es cierto que si sabes que ese "numerito" es de un caracter sólo y que está al final de la cadena (de cada "registro" .. entiendase a registro a algo separado por salto de línea \n o \r\n según S.O.) puedes usar strlen() para contar los caracteres de ese "registro" (usa file() para leerlos sobre un array) y así quedarte con el último carcter usando substr().

más info:
www.php.net/file
www.php.net/fgetcsv
www.php.net/strlen
www.php.net/explode
etc...

Un saludo,
  #7 (permalink)  
Antiguo 09/10/2004, 19:08
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 13 años, 7 meses
Puntos: 0
vale gracias, miraré esas funciones, pero a ver si puedes decirme qué está mal en mi código, el del primer mensaje, qué falla y qué cambiar porque no entiendo qué hago mal en el código.

graciasss
  #8 (permalink)  
Antiguo 11/10/2004, 18:43
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Por mi parte no he probado el código .. a simple vista -sin probarlo- a veces se hace dificil seguir la lógica/flujo de un código dado .. Pero, .. todoss mis consejos ivan por el lado de generar un "formato" más standard y sobre todo fácil y seguro de leer e interpretar para evitar errores.

Intenta lo que te propongo .. o bien espera a un compañero que pueda probar y evaluar tu código.

Un saludo,
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 04:49.