Foros del Web » Programando para Internet » PHP »

Extraer datos de un archivo de texto

Estas en el tema de Extraer datos de un archivo de texto en el foro de PHP en Foros del Web. Tengo un archivo de texto que tiene la siguiente estructura //////// // comentarios Categoria /////// //titulo1 [codigo2] atributo1=string1 atributo2=string2 //titulo2 [codigo1] atributo1=string1 atributo2=string2 opcional1=string3 //titulo3 ...
  #1 (permalink)  
Antiguo 16/12/2005, 06:21
 
Fecha de Ingreso: diciembre-2005
Mensajes: 5
Antigüedad: 12 años
Puntos: 0
Pregunta Extraer datos de un archivo de texto

Tengo un archivo de texto que tiene la siguiente estructura

////////
// comentarios Categoria
///////

//titulo1
[codigo2]
atributo1=string1
atributo2=string2

//titulo2
[codigo1]
atributo1=string1
atributo2=string2
opcional1=string3

//titulo3
[codigo3]
atributo1=string1
atributo2=string2
opcional1=string3
opcional2=string4
....

y me interesa llenar una base de de datos, nediante php, con los siguientes campos:
Categoria
Codigo
Atributo1
Atributo2
Opcional1
Opcional2
.....
Opcional6

La duda que tengo es cual es la mejor forma de conseguir esto. Las opciones que logoro ver (con mi poco conocimiento de php) son :
- Almacenar todo el archivo (que es bastante grande) en una variable y mediante expresiones regulares separar todos los campos y meterlos a un arreglo.
- Ir leyendo linea a linea el archivo y en cada linea decidir, tambien mediante expresiones regulares, si corresponde a un atributo o codigo u otro campo.

No se si existirá otra forma.

He probado con una clase que sirve para trabajar con archivos de configuracion (.ini) pero no funciona por que los strings de los atributos contienen caracteres como | o ^ () etc.
  #2 (permalink)  
Antiguo 16/12/2005, 07:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
- Ir leyendo linea a linea el archivo y en cada linea decidir, tambien mediante expresiones regulares, si corresponde a un atributo o codigo u otro campo.
Usa esta técnica y así vas creando tus registros en tu BD para "noralizar" tu BD completa ..

Si el formato es el que describes ... incluso no te haría falta usar expresiones regulares por qué lo tienes bien delimitado ..

Un saludo,
  #3 (permalink)  
Antiguo 16/12/2005, 09:54
 
Fecha de Ingreso: diciembre-2005
Mensajes: 5
Antigüedad: 12 años
Puntos: 0
Cita:
Iniciado por Cluster
Usa esta técnica y así vas creando tus registros en tu BD para "noralizar" tu BD completa ..

Si el formato es el que describes ... incluso no te haría falta usar expresiones regulares por qué lo tienes bien delimitado ..

Un saludo,
Estoy probando con
Código PHP:
 $nombre="prueba.txt";
  
$contenedor=fopen($nombre,"r");
  
$archivo=fread($contenedor,filesize($nombre));
  
$registros=explode("//",$archivo);
  
$i=0;
  foreach(
$registros as $registro){
      if(
ereg("\s",$registro)){
          
$campos[$i]=explode("\r\n",$registro);
          
$i++;
      }
  }
  
fclose($contenedor); 
Esto me genera en la variable registro algo como:
Código:
//titulo1\r\n[codigo2]\r\natributo1=string1\r\natributo2=string2
Por que si te fijas cada registro comienza con //.
Lo que no entiendo es por que no se llena el arreglo con toda la informacion del archivo, algunos datos entran y otros no.
  #4 (permalink)  
Antiguo 16/12/2005, 10:11
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Podrísa usar simplement file() ..

No debes leer tu archivo de esa forma . .buscando lo que para tí es un "registro" sino línea por línea (file() hace eso.. te entregaría un array con un elemento por línea que contenta ese archivo).

Luego tendrías que evaluar cada "linea" y buscar si empieza por tu caracter //titulo .. o [ .. Aquí vendría bien expresiones regulares .. pero también con un substr_count().

Por qué ese archivo de "configuración" tiene ese formato?. No podría ser algo más "lógico" para trabajarlo tipo:

Categoria | Codigo | Atributo1 | Atributo2 | Opcional1 | OpcionalX <-- registro 1
Categoria | Codigo | Atributo1 | Atributo2 | Opcional1 | OpcionalX <-- registro2
Categoria | Codigo | Atributo1 | Atributo2 | Opcional1 | OpcionalX <-- registro N


Un saludo,
  #5 (permalink)  
Antiguo 16/12/2005, 13:01
 
Fecha de Ingreso: diciembre-2005
Mensajes: 5
Antigüedad: 12 años
Puntos: 0
Cita:
Iniciado por Cluster
No debes leer tu archivo de esa forma . .buscando lo que para tí es un "registro" sino línea por línea (file() hace eso.. te entregaría un array con un elemento por línea que contenta ese archivo).
No se si estoy bien en lo que pienso, pero creo que si meto el archivo completo en una variable estoy haciendo que el programa consuma memoria en exceso. O no?
Cita:
Iniciado por Cluster
Por qué ese archivo de "configuración" tiene ese formato?.
Ese archivo es de un juego (warcraft III). El archivo contiene informacion de las teclas asignadas a cada acción durante el juego. Mi idea es poder hacer un script que me permita volver a escribir ese archivo con la configuración de teclas que yo quiera y no tener que estar modificando el archivo manualmente. En una primera etapa pretendo meter toda la info del archivo en una base de datos. Con esa info en la bd puedo volver a escribir el archivo con distintas configuraciones de teclas que se podrian hacerse incluso en una pagina web disponible para todos.

Ademas el archivo podría incluir nuevas opciones en futuras actualizaciones del juego por eso es importante a mi parecer el script que permita extraer la info y meterla en bd.

Última edición por Roco3D; 16/12/2005 a las 13:07
  #6 (permalink)  
Antiguo 16/12/2005, 13:37
Avatar de Quest  
Fecha de Ingreso: diciembre-2002
Ubicación: Santiago
Mensajes: 129
Antigüedad: 15 años
Puntos: 2
si ese es el formato del archivo de texto te podria servir tambien las funciones

read_ini_file
write_ini_file

saludos y espero te sirvan.
__________________
http://victorsanmartin.com
Web Developer
http://www.guiasitios.cl
  #7 (permalink)  
Antiguo 16/12/2005, 13:43
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
No se si estoy bien en lo que pienso, pero creo que si meto el archivo completo en una variable estoy haciendo que el programa consuma memoria en exceso. O no?
Si, así es .. pero no hay otra forma de procesar un archivo .. la lectura es secuencial de principio a fin -> a una variable (un array por ejemplo) y de ahí lo procesas. ¿que crees que hace: $archivo=fread($contenedor,filesize($nombre)); ? .. exactamente eso mismo .. lo lee .. sólo que en ese caso lo hace hacia una cadena no un array como lo hace file()

Prueba con esta sugerencia:
Cita:
hackajar <matt> yahoo <trot> com
05-Dec-2005 10:17
When working with VERY large files, php tends to fall over sideways and die.

Here is a neat way to pull chunks out of a file very fast and won't stop in mid line, but rater at end of last known line. It pulled a 30+ million line 900meg file through in ~ 24 seconds.

NOTE:
$buf just hold current chunk of data to work with. If you try "$buf .=" (note 'dot' in from of '=') to append $buff, script will come to grinding crawl around 100megs of data, so work with current data then move on!
Código PHP:
//File to be opened
$file "huge.file";
//Open file (DON'T USE a+ pointer will be wrong!)
$fp fopen($file'r');
//Read 16meg chunks
$read 16777216;
//\n Marker
$part 0;

while(!
feof($fp)) {
   
$rbuf fread($fp$read);
   for(
$i=$read;$i || $n == chr(10);$i--) {
       
$n=substr($rbuf$i1);
       if(
$n == chr(10))break;
       
//If we are at the end of the file, just grab the rest and stop loop
       
elseif(feof($fp)) {
           
$i $read;
           
$buf substr($rbuf0$i+1);
           break;
       }
   }
   
//This is the buffer we want to do stuff with, maybe thow to a function?
   
$buf substr($rbuf0$i+1);
   
//Point marker back to last \n point
   
$part ftell($fp)-($read-($i+1));
   
fseek($fp$part);
}
fclose($fp); 
http://www.php.net/manual/en/function.fgets.php

Cita:
Ese archivo es de un juego (warcraft III).
Ok,

Un saludo,
  #8 (permalink)  
Antiguo 17/12/2005, 05:49
 
Fecha de Ingreso: diciembre-2005
Mensajes: 5
Antigüedad: 12 años
Puntos: 0
Esto me ha dado buenos resultados:
Código PHP:
<?php
  
#probando fgets
  
$archivo="prueba.txt";
  
$gestor=fopen($archivo,"r");
  
$i=0;
  while(!
feof($gestor)){
      
$linea[$i]=rtrim(fgets($gestor));
      
#comprobar que linea es y mandar dato a la bd
      
echo $linea[$i];
      
$i++;
     
  }
  
fclose($gestor);
?>
Puedo leer el archivo linea a linea. Me falta la parte de decidir en que campo de la base de datos almacenar cada línea. Me parece que la mejor manera de hacer esto sería con expresiones regulares y la funcion preg_match.
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 13:10.