PHP - Consulta [ARCHIVOS TXT]

   
Vista:
Imágen de perfil de Nicolás Ignacio

Consulta [ARCHIVOS TXT]

Publicado por Nicolás Ignacio (16 intervenciones) el 13/02/2015 20:47:18
Estimados, este es mi primer tema en el Foro, estoy dando mis pasos en PHP, no he encontrado en el Foro, perdón si no es así el tema específico que necesito resolver.

Tengo archivos .txt que le envían a mi cliente desde AFIP (recaudación en Argentina). Y ellos me brindan un diseño de registro, desde y hasta qué posiciones va cada campo, el tipo de campo, su longitud, etc.

Ahora, estoy creando el script para procesarlo, utilizo las funciones fopen() para abrirlo, las funciones filesize() para determinar su tamaño, fgets() para leer una línea y feof() para determinar hasta que termine el archivo, entre otras.

Pero necesito ir iterando entre línea por línea, y posición por posición, en realidad creo que eso es lo mejor, porque por ejemplo tengo el campo código de obra social, longitud 6, desde 1 hasta 6, campo numérico.

He visto las funciones de strings pero no se darme cuenta o no puedo sacar la lógica de esto tan fácil jajajaj.

Bueno, aguardo alguna respuesta quien pueda ayudarme.

Saludos y gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Consulta [ARCHIVOS TXT]

Publicado por xve (5517 intervenciones) el 13/02/2015 21:41:40
Hola Nicolás, creo que la instrucción que necesitas es substr() para obtener partes de una cadena...

En la pagina del PHP tienes un montón de ejemplos:
http://php.net/manual/es/function.substr.php

Estos son los ejemplos que encontraras:
1
2
3
4
5
6
7
$rest = substr("abcdef", 0, -1);  // devuelve "abcde"
$rest = substr("abcdef", 2, -1);  // devuelve "cde"
$rest = substr("abcdef", 4, -4);  // devuelve false
$rest = substr("abcdef", -3, -1); // devuelve "de"
$rest = substr("abcdef", -1);    // devuelve "f"
$rest = substr("abcdef", -2);    // devuelve "ef"
$rest = substr("abcdef", -3, 1); // devuelve "d"

Coméntanos si te queda alguna duda, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Nicolás Ignacio

Consulta [ARCHIVOS TXT]

Publicado por Nicolás Ignacio (16 intervenciones) el 13/02/2015 21:51:12
Hola!!

Entiendo perfecto!! creo que si es lo que necesito, pero ahora en este preciso momento mirando los archivos, veo que tengo las mismas posiciones en diferentes líneas;

Por ejemplo: en línea1 tengo un código de la obra social en la posición 3 hasta la 8 y en la línea 2 tengo el importe aportado desde la posición 4 hasta la 8. Entonces tendría que guardar supongo, en un array línea por línea no?

Mil gracias por la respuesta!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nicolás Ignacio

Consulta [ARCHIVOS TXT]

Publicado por Nicolás Ignacio (16 intervenciones) el 13/02/2015 22:30:02
Mira, tengo este humilde código:

$archivo = "mi_archivo.txt";

$openfile = fopen ($archivo, "r");

$size = filesize ($archivo); //Por las dudas para saber el tamaño de mi archivo.

//Acá quiero hacer un bucle para meter líneas en un array, no se me ocurre otra....

for ($i=0; $i <= "NO SE COMO COMPARARLO"; $i++){

$lineas[$i] = fgets($openfile);

}

print_r ($lineas); //Obviamente no sale nada ya que no estoy realizando la condición.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta [ARCHIVOS TXT]

Publicado por MMan (59 intervenciones) el 13/02/2015 22:45:17
hola

http://lmgtfy.com/?q=parse+txt+file+php



$txt_file = file_get_contents('path/to/file.txt');
$rows = explode("\n", $txt_file);

foreach($rows as $row => $data)
{
/// procesar cada linea
}


dependiendo si tu txt tiene alguna estructura, delimitadores o algo q identifique como puedas dividirlo
puedes usar regex, explode o substr (este ultimo da mas trabajo :P )
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Nicolás Ignacio

Consulta [ARCHIVOS TXT]

Publicado por Nicolás Ignacio (16 intervenciones) el 13/02/2015 22:54:17
Hola!

No puedo creer las pocas líneas que has escrito para solucionar mi tema....el que sabe sabe. Al igual que el anterior me han ayudado en este tema.

Te cuento que no tiene delimitadores, solo te dice el diseño de registro, desde y hasta, las posiciones de cada campo y cada campo que tipo de dato es y a qué corresponde.

Ahora quedará con substr() hacer eso para cada línea, supongo que con un for o un foreach mismo puedo hacer eso no?, luego lo deberé guardar en una base de datos para su posterior representación en un grid.

Saludos y gracias nuevamente!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nicolás Ignacio

Consulta [ARCHIVOS TXT]

Publicado por Nicolás Ignacio (16 intervenciones) el 10/03/2015 16:22:44
Hola! Nuevamente con este tema, tuve que retomar el ejercicio!

Adjunto el archivo txt que tengo que procesar. La primer línea es el header, de la segunda en adelante son los registros procesados en el servidor, esos mismos ya puedo capturarlos en sus respectivas variables, como ser código de obra social, cuit del aportante, etc.

Pero mi duda y no logro dar en la tecla, es que las últimas líneas pertenecen al trailer del archivo donde hay totales, cómo hago para saber cuándo vienen esas líneas? si el detalle depende de la cantidad de registros que haya procesado en la transacción....

Mi idea es hacer un ciclo en el detalle para que los recopile a todos los registros, pero cómo le digo que a partir de la línea tal o de a partir de tal condición vienen los trailers que tienen otra estructura?

Bueno espero no molestar y aguardo alguna respuesta, saludos!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta [ARCHIVOS TXT]

Publicado por MMan (59 intervenciones) el 10/03/2015 19:50:38
...si todos tus archivos txt tienen la misma cantidad de lineas.. podrias hacerlo con un contador

si alguno de tus archivos tiene mas lineas o menos... eso no te serviria
-------

otra forma, podrias revisar el contenido de cada fila...

por ejem.
lees una linea
si la linea empieza con "TNNOM" ... termino los registros, empezo los totales

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
foreach($lineassss as $linea)
{
      $datos = explode(" ", $linea);  // separas por espacio
 
//      $datos[0] ;  // primer grupo
//      $datos[1] ; // segundo grupo
 
// http://php.net/manual/es/function.strpos.php  
 
$pos = strpos($datos[0], "TNNOM");
 
// si es falso... no encontro,    es un registro
if ($pos === false) {
  // agregar a la Basedatos
 
 
} else {
 // es totales
 
 
}  // fin if-else
 
} // fin foreach



------------------

otra forma, podria ser contar el numero de columnas despues de dividir la linea

1
2
3
4
5
6
7
8
9
10
$datos = explode(" ", $linea);  // separas por espacio
$numcol = count ($datos);
 
if ($numcol >1 ){
   // 2 columnas  ... es registro
 
} else {
  // 0 o 1 columna... totales ?
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Nicolás Ignacio

Consulta [ARCHIVOS TXT]

Publicado por Nicolás Ignacio (16 intervenciones) el 10/03/2015 20:53:51
Estimado MMan, la verdad que ha sido muy clara tu ayuda!

Creo que la segunda opción es más óptima, ya que si se la cantidad de campos tienen las líneas...será cuestión de probar.

Ahora me han dicho que no es una buena prácitca leer el archivo así como mencionaste primero

$txt_file = file_get_contents('path/to/file.txt');
$rows = explode("\n", $txt_file);

Lo cual para mi es super práctico, porque me dijeron que hacer un array con explode() que pueda contener más de 10 mil líneas, registros, índices, va a saturar la memoria. Que lo que conviene es utilizar fopen y mientras feof ir procesando cada línea.

Qué opinas al respecto? yo no tengo mucha experiencia como para aseverar o refutar.

Muchas gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta [ARCHIVOS TXT]

Publicado por MMan (59 intervenciones) el 10/03/2015 21:14:58
creo.. que si... y no :)

depende de lo que procesas... tu fichero solo tiene 300-400kb, con las maquinas que hay hoy en dia... con muchos megas o gigas de memoria.. es una pequeñez

por otra parte, si consumes muchos recursos.. creo que tendrias que poner en la balanza...

facilidad de proceso, recursos y tiempo

... si tu jefe te dice.. quiero para mañana a primera hora este reporte...

creo que buscaria la manera mas rapida de hacerlo y luego si hay tiempo.. buscaria optimizar el proceso

y en mi defensa... se dice que "un programador flojo.. es un buen programador" jajaja

1
2
3
4
5
6
7
8
9
$f = fopen ("fichero.txt", "r");
 
while (! feof ($f)) {
        $line= fgets ($f);
        /// procesa linea
    ....
     ....
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Nicolás Ignacio

Consulta [ARCHIVOS TXT]

Publicado por Nicolás Ignacio (16 intervenciones) el 12/05/2015 16:47:16
Perdón por la demora en esta respuesta, estuve con muchos temas complejos de explicar .....

Ha sido de mucha utilidad toda tu ayuda.

Saludos!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar