PDA

Ver la Versión Completa : Ficheros texto


Taburiente
14-09-2011, 14:49:26
Hola,

Primero decir que soy un aprendiz en esto de >Delphi, mi poca experiencia esta mas dirigida a base de datos y mi experiencia en ficheros planos es escaso por lo que he osado ( dado mi urgencia) a pedir ayuda en este foro. No quiero ni pretendo abusar de nada ni de nadie pero necesito orientación de como conseguir lo siguiente:

Partiendo de fichero "LISTADO_FICHERO.txt" obtener y nombrar tantos ficheros como cabeceras tenga en contenido (ver ejemplo adjunto) así como la estructura que tiene dichos ficheros. Después ya tendría que realizar otras operaciones pero eso creo que si sabría como hacerlo, pero para ello necesito solventar este primer paso.

Gracias anticipada por cualquier tipo de ayuda.


Saludos

ecfisa
14-09-2011, 16:39:24
Hola Taburiente.


procedure GenerarArchivos(const Ruta: string; const Nombre: string);
var
Origen, Destino: TextFile;
Linea: string;
begin
Assign(Origen,Ruta+Nombre);
Reset(Origen);
while not Eof(Origen) do
begin
Readln(Origen, Linea);
if Pos('.afp',Linea) <> 0 then
begin
// poner extensión .txt
Assign(Destino,Ruta+Copy(ExtractFileName(Linea),1,Length(Linea)-3)+'TXT');
Rewrite(Destino);
Writeln(Destino,'CODE_LIST JAZZTEL.PAGO11M1'+Linea);
Writeln(Destino,'#CMD app load_job_conf_file 50');
Writeln(Destino,'------------------------------------');
Readln(Origen, Linea);
while (Pos('.afp',Linea)=0)and(Pos('-',Linea)=0) do
begin
Writeln(Destino,Linea);
Readln(Origen, Linea);
end;
Writeln(Destino,'-------------------------------------');
CloseFile(Destino);
end;
end;
CloseFile(Origen);
end;

Hubo datos que agregué a mano por que no existen en el archivo orígen y otros que omití por el mismo motivo. Pero en líneas generales dá el formato que solicitas a cada uno de los archivos generados:

CODE_LIST JAZZTEL.PAGO11M1PSEP11M01_3C1DS1.PP001.a00.afp
#CMD app load_job_conf_file 50
------------------------------------
193759412
193812934
193838063
193865745
-------------------------------------

Datos agregados a mano:

CODE_LIST JAZZTEL.PAGO11M1PSEP11M01_3C1DS1.PP001.a03.afp
#CMD app load_job_conf_file 50

Datos omitidos:
MP 1 1 XXX

Llamada al procedimiento:

GenerarArchivos('C:\TEMP\', 'LISTADO_FICHERO.TXT');


Saludos.

Taburiente
14-09-2011, 17:44:49
Hola ecfisa,

Primero de todo muchísimas gracias, no solo por tu gran ayuda, sino por la rapidez de la misma, me quito el sombrero.

Luego decirte que unos de mis muchos problema es precisamente incluir en los ficheros que genero los datos que tu me has omitido:



MP 1 1 XXX
MP 2 2 XXX
MP 3 3 XXX

Es importante incluir dicha información para que luego me lo reconozca otra aplicación que necesita dicha estructura. ¿ que tal lo ves ?


Gracias

ecfisa
14-09-2011, 17:55:14
Hola Taburiente.
Luego decirte que unos de mis muchos problema es precisamente incluir en los ficheros que genero los datos que tu me has omitido

Correcto, pero ¿ De donde salen esos datos ? por que en el archivo que adjuntaste, LISTADO_FICHERO.txt, no existen y de la nada no se pueden fabricar...

Ahora, si se trata sólo de poner la cadena textualmente, bastaría con agregarlo en la línea:

...
while (Pos('.afp',Linea)=0)and(Pos('-',Linea)=0) do
begin
Writeln(Destino, 'MP 1 1 XXX' +Linea); // aquí se agrega la cadena
Readln(Origen, Linea);
end;
...

Al código anterior.


Un saludo.

Taburiente
14-09-2011, 18:03:49
Hola de nuevo ecfisa,

Efectivamente, eso datos no están en el fichero origen pero si tienen que estar en los ficheros originados y por lo tanto necesito agregarlos y que como puedes comprobar empiezan por MP y termina en XXX y en el medio dos colunnas que es un cosecutivo desde 1 hasta xxxxxxxxxx dependiendo del numero de registros.

Muchas gracias por tu tiempo y esfuerzo


Saludos

ecfisa
14-09-2011, 18:20:39
Hola de nuevo.
Partiendo de fichero "LISTADO_FICHERO.txt" obtener y nombrar tantos ficheros como cabeceras tenga en contenido (ver ejemplo adjunto) así como la estructura que tiene dichos ficheros. Después ya tendría que realizar otras operaciones pero eso creo que si sabría como hacerlo, pero para ello necesito solventar este primer paso


Creo que te quedaste corto con las explicaciones... :)

Pero a ver... Si no te entiendo mál, queres que haya un contador parcial para las líneas de cada archivo generado y uno general para el total de ellas ('xxxxxxxxxx').

Si es así, es muy sencillo modificar el código anterior para que lo haga:

procedure GenerarArchivos(const Ruta: string; const Nombre: string);
var
Origen, Destino: TextFile;
Linea: string;
ContGral: Int64; // Contador general de líneas
ContLinea: Integer; // Contador parcial de líneas
begin
Assign(Origen,Ruta+Nombre);
Reset(Origen);
ContGral:= 1;
while not Eof(Origen) do
begin
Readln(Origen, Linea);
if Pos('.afp',Linea) <> 0 then
begin
ContLinea:= 1;
Assign(Destino,Ruta+Copy(ExtractFileName(Linea),1,Length(Linea)-3)+'TXT');
Rewrite(Destino);
Writeln(Destino,'CODE_LIST JAZZTEL.PAGO11M1'+Linea);
Writeln(Destino,'#CMD app load_job_conf_file 50');
Writeln(Destino,'------------------------------------');
Readln(Origen, Linea);
while (Pos('.afp',Linea)=0)and(Pos('-',Linea)=0) do
begin
Writeln(Destino,Format('%s %d %d %d %s',['MP', ContLinea, ContLinea, ContGral, Linea]));
Readln(Origen, Linea);
Inc(ContLinea);
Inc(ContGral);
end;
Writeln(Destino,'-------------------------------------');
CloseFile(Destino);
end;
end;
CloseFile(Origen);
end;

Los archivos generados, basados en el archivo que enviaste, (sin ajustar la tabulación) quedarían así:

CODE_LIST JAZZTEL.PAGO11M1PSEP11M01_3C1DS1.PP001.a00.afp
#CMD app load_job_conf_file 50
------------------------------------
MP 1 1 1 193759412
MP 2 2 2 193812934
MP 3 3 3 193838063
MP 4 4 4 193865745
-------------------------------------

CODE_LIST JAZZTEL.PAGO11M1PSEP11M01_3C1DS1.PP001.a01.afp
#CMD app load_job_conf_file 50
------------------------------------
MP 1 1 5 194480436
MP 2 2 6 194482282
MP 3 3 7 194485890
MP 4 4 8 194486962
-------------------------------------

CODE_LIST JAZZTEL.PAGO11M1PSEP11M01_3C1DS1.PP001.a02.afp
#CMD app load_job_conf_file 50
------------------------------------
MP 1 1 9 194515253
MP 2 2 10 194515448
MP 3 3 11 194521818
MP 4 4 12 194522927
MP 5 5 13 194524611
-------------------------------------


De todas maneras no me queda muy en claro que papel juegan los dos números posteriores a 'MP'... :rolleyes:

Saludos.

Taburiente
14-09-2011, 18:31:25
Hola amigo

Ya te considero un amigo despues de toda tu ayuda :D


Creo que te quedaste corto con las explicaciones

Perdona si no me explique bien, creía que con los ficheros ejemplos y me explicación seria suficiente, pero veo no no fuy lo suficientemente habil. lo siento.


En cuanto a tu codigo solo tendre que cambiar la siguiente linea:

Writeln(Destino,Format('%s %d %d %d %s',['MP', ContLinea, ContLinea, ContGral, Linea])

por la siguiente:

Writeln(Destino,Format('%s %d %d %d %s',['MP', ContLinea, ContLinea, XXX, Linea]));

puesto que no necesito el contador general si no precisamente XXX.

Por lo demás todo perfecto.

Gracias por tu inestimada ayuda, prometo ponerme las pilas con esto de los ficheros.

Saludos

ecfisa
14-09-2011, 18:34:17
De nada Taburiete, me alegro haber podido ayudarte. :)

Saludos.