REXX - GENERA MÚLTIPLES ARCHIVOS DESDE REPOSITORIO DE TEXTO

Todo lo relacionado con REXX en este ambiente.
Responder
Víctor Hugo Zepeda
Usuario
Usuario
Mensajes: 9
Registrado: 14 May 2011, 07:53
País: Chile
Ciudad: Santiago
Ocupación: Otra

REXX - GENERA MÚLTIPLES ARCHIVOS DESDE REPOSITORIO DE TEXTO

Mensaje por Víctor Hugo Zepeda » 01 Nov 2012, 23:49

Aquí les va un programa REXX que puede ser de mucha utilidad.

Espero les guste!

Código: Seleccionar todo

/* (c) Víctor Hugo Zepeda Concha;
       Santiago, Miércoles 3 de Diciembre del 2003
       Nombre : ZSAR.REX-(ZepedaSeparaARchivo)
       * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
       *                                                               *
       * OBJETIVO      : Separar un archivo en múltiples salidas       *
       *                                                               *
       * PLATAFORMA    : WINDOWS                                       *
       *                                                               *
       * FORMATO       : ZSAR archivo.ext cantidad                     *
       *                                                               *
       * SIGNFICADO    : archivo.ext, es el repositorio de entrada     *
       *                                                               *
       *                 cantidad, indica  el número  de registros que *
       *                 tendrá(n) lo(s) archivo(s) de salida.         *
       *                                                               *
       * COMO EJECUTAR : Supongamos que el archivo de entrada se lla_  *
       *                 ma DATOSZSAR.TXT, el que contiene 7.297.500   *
       *                 registros y deseamos separarlo en repositorios*
       *                 que contengan 1.070.000 registros cada uno.   *
       *                 Para ello invocaremos a la macro asi:         *
       *                  ZSAR DATOSZSAR.TXT 1070000 en la línea de    *
       *                  comandos del editor THE, el que tiene embe_  *
       *                  bido el lenguaje REXX.                       *
       *                                                               *
       *                 ZSAR creará nnn archivos con el nombre:       *
       *                  DATOSZSAR_nnn.TXT                            *
       *                  Generará tantos archivos hasta completar los *
       *                  7.297.500 registros.                         *
       *                  Además al final del proceso les levantará un *
       *                  archivo con el detalle completo de la sepa_  *
       *                  ración del archivo de entrada y sus salidas  *
       *                                                               *
       * SOBRE THE     : Pueden visitar la página www.rexx.org, donde  *
       *                 podrán bajar el producto completo y más       *
       *                                                               *
       * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
Trace Off
  ElapsedTime=Time('E');Call CurrentDate
  Numeric Digits +18

/***********************************************************************
 VALIDACION DE PARAMETROS INGRESADOS
***********************************************************************/
 Parse upper arg InputFile InitialStep .
 If InputFile=""
   then do
     MSG "ZSAR-700E 'InputFile' omitido"
     Exit
   end
 If InitialStep="" | DataType(InitialStep,'N')=0 | InitialStep<2
   then do
     MSG "ZSAR-701E 'InitialStep' omitido o inv lido"
     Exit
   end

/***********************************************************************
 DETERMINO NOMBRE Y TIPO DEL ARCHIVO
***********************************************************************/
 Dot=Pos('.',InputFile,1)
 FileName=SubStr(InputFile,1,(Dot-1))
 FileType=SubStr(InputFile,(Dot+1))

/***********************************************************************
 VARIABLES DE USO GENERAL
***********************************************************************/
 InitCounter=0;StepCounter=0;InCounter=0;OutCounter=0;FileCounter=0
 BlockCounter=1;EndOfFile="NO";NextSequence=0;RecFm="F";LRecLMin=99999
 LRecLMax=00000

/***********************************************************************
 ASIGNACION Y VERIFICACION DE ARCHIVO DE ENTRADA
***********************************************************************/
 DirBase='D:\Z\$PAZO\'
 InFile=DirBase||InputFile
 FE=Stream(InFile,'C','QUERY EXISTS')
 If FE\=InFile
   then do
     MSG "ZSAR-702E Archivo '"InFile"' no existe"
    exit
   end

/***********************************************************************
 MODULO DE CONTROL PRINCIPAL
***********************************************************************/
 Do 40
    Say " "
 End
 "X "||DirBase||FileName||".eSt"
 "Set MsgLine On 2 1 Overlay";"Set MsgMode On"
 ":1"
 "ADD";"REPLACE "Copies("-",82)
 "ADD";"REPLACE ZSAR-703I "||CrrDt
 "ADD";"REPLACE "Copies("-",82)
 "ADD";"REPLACE ZSAR-704I ZSAR est  separando el archivo '"||,
       InputFile||"'"||" en m£ltiples repositorios"
 "ADD";"REPLACE           Esto puede tomar varios minutos "||,
       "dependiendo del "||"tama¤o de la entrada"
 "ADD";"REPLACE "Copies("-",82)
 Say Copies("-",82)
 Say "ZSAR-705I "||CrrDt
 Say Copies("-",82)
 Say "ZSAR-706I ZSAR est  separando el archivo '"InputFile||"'"||,
     " en m£ltiples repositorios"
 Say "          Esto puede tomar varios minutos dependiendo del "||,
     "tama¤o de la entrada"
 Say Copies("-",82)
 Signal on NotReady
 Call ReadInFile
 Do until EndOfFile="YES"
    InitCounter=InitCounter+1
    StepCounter=InitialStep
    Sequence=Right(BlockCounter,3,"0")
    If InitCounter=StepCounter
      then do
        "ADD";"REPLACE ZSAR-707I "||DirBase||FileName||"_"||Sequence||,
              "."||FileType||" creado con "||,
              Right(StepCounter,8,"0")||" Reg(s)."
        Say "ZSAR-708I "||DirBase||FileName||"_"||Sequence||,
            "."||FileType||" creado con "||,
            Right(StepCounter,8,"0")||" Reg(s)."
        FE=Stream(OutputFile,'C','CLOSE')
        InitCounter=0;FileCounter=FileCounter+1
        StepCounter=StepCounter+InitialStep
        BlockCounter=BlockCounter+1
      end
    OutputFile=DirBase||FileName||"_"||Sequence||"."||FileType
    If Sequence\=NextSequence
      then do
        FE=Stream(OutputFile,'C','QUERY EXISTS')
        If FE=OutputFile
          then do
            MSG "ZSAR-709E Archivo '"OutputFile"' ya existe"
            FE=Stream(InFile,'C','CLOSE')
            FE=Stream(OutputFile,'C','CLOSE')
            exit
          end
        NextSequence=Sequence
      end
    LINEOUT(OutputFile,R_InFile)
    OutCounter=OutCounter+1
    Call ReadInFile
 End
 If InitCounter>0
   then do
     "ADD";"REPLACE ZSAR-710I "||DirBase||FileName||"_"||Sequence||,
           "."||FileType||" creado con "||,
           Right(InitCounter,8,"0")||" Reg(s)."
     Say "ZSAR-711I "||DirBase||FileName||"_"||Sequence||,
         "."||FileType||" creado con "||,
         Right(InitCounter,8,"0")||" Reg(s)."
   end

/***********************************************************************
 LIBERO ASIGNACION DE ARCHIVOS
***********************************************************************/
 FE=Stream(InFile,'C','CLOSE')
 FE=Stream(OutputFile,'C','CLOSE')

/***********************************************************************
 ESTADISTICAS DEL PROCESO
***********************************************************************/
 Call CurrentDate
 ElapsedTime=Time('R')
 "ADD";"REPLACE "Copies("-",82)
 "ADD";"REPLACE ZSAR-712I "||InCounter||" registro(s) leido(s) de:"
 "ADD";"REPLACE           "||InFile
 "ADD";"REPLACE ZSAR-713I "||FileCounter||,
       " archivo(s) creado(s) con "||InitialStep||" registro(s) c/u"
 If InitCounter>0
   then do
     "ADD";"REPLACE ZSAR-714I 1 archivo creado con "||InitCounter||,
           " registro(s)"
   end
   else do
     BlockCounter=BlockCounter-1
   end
 "ADD";"REPLACE ZSAR-715I "||OutCounter||" registro(s) "||,
       "grabado(s) en "||BlockCounter||" archivo(s)"
 "ADD";"REPLACE "Copies("-",82)
 "ADD";"REPLACE ZSAR-716I "||CrrDt
 If LRecLMax<>LRecLMin
   then do
     RecFm="V"
   end
 "ADD";"REPLACE ZSAR-717I Caracteristicas del archivo de entrada"
 "ADD";"REPLACE            RecFm="||RecFm||" LRecLMin="||LRecLMin||,
       " LRecLMax="||LRecLMax
 "ADD";"REPLACE "Copies("-",82)
 "ADD";"REPLACE ZSAR-718I Tiempo ocupado en la separaci¢n: "||,
       "00:"||Right(ElapsedTime%60,2,"0")||":"||,
       Right(Strip(Format((ElapsedTime//60),2,0)),2,"0")
 "ADD";"REPLACE "Copies("-",82)
 ":1"
 "CURSOR CMDLINE"
 Say Copies("-",82)
 Say "ZSAR-719I "||InCounter||" registro(s) leido(s) de:"
 Say "          "||InFile
 Say "ZSAR-720I "||FileCounter||,
     " archivo(s) creado(s) con "||InitialStep||" registro(s) c/u"
 If InitCounter>0
   then do
     Say "ZSAR-721I 1 archivo creado con "||InitCounter||" registro(s)"
   end
 Say "ZSAR-722I "||OutCounter||" registro(s) grabado(s) en "||,
     BlockCounter||" archivo(s)"
 Say Copies("-",82)
 Say "ZSAR-723I "||CrrDt
 Say "ZSAR-724I Caracteristicas del archivo de entrada"
 Say "          RecFm="||RecFm||" LRecLMin="||LRecLMin||,
     " LRecLMax="||LRecLMax
 Say Copies("-",82)
 Say "ZSAR-725I Tiempo ocupado en la separaci¢n: "||,
     "00:"||Right(ElapsedTime%60,2,"0")||":"||,
     Right(Strip(Format((ElapsedTime//60),2,0)),2,"0")
 Say Copies("-",82)
 MSG "ZSAR-726I Listo!!!!. Si deseas guardar(file), "||,
     "si no(qquit)."
Exit

/***********************************************************************
 RUTINA DE LECTURA
***********************************************************************/
ReadInFile:
 R_InFile=LINEIN(InFile)
 If Length(R_InFile)<LRecLMin
   then do
     LRecLMin=Length(R_InFile)
   end
 If Length(R_InFile)>LRecLMax
   then do
     LRecLMax=Length(R_InFile)
   end
 InCounter=InCounter+1
Return

/***********************************************************************
 DETERMINA FECHA Y HORA ACTUAL
***********************************************************************/
CurrentDate:
   AnoMes=SubStr(Date(S),1,4)||'.'SubStr(Date(S),5,2)
   ZWD.0="Lunes";  ZWD.1="Martes";ZWD.2="Miercoles";ZWD.3="Jueves"
   ZWD.4="Viernes";ZWD.5="S bado";ZWD.6="Domingo"
   ZMT.01="Enero";ZMT.02="Febrero";ZMT.03="Marzo";ZMT.04="Abril"
   ZMT.05="Mayo";ZMT.06="Junio";ZMT.07="Julio";ZMT.08="Agosto"
   ZMT.09="Septiembre";ZMT.10="Octubre";ZMT.11="Noviembre"
   ZMT.12="Diciembre"
   Wkd=Date(b)//7;Mth=Substr(Date(e),4,2)
   CrrDt=ZWD.Wkd" "Substr(Date(S),7,2)" de "||,
         ZMT.Mth" del "||'20'||Substr(Date(o),1,2)" - "||,
         Time()
Return

NOTREADY:
 EndOfFile="YES"

RESULTADO DE LA EJECUCIÓN

Código: Seleccionar todo

----------------------------------------------------------------------------------
ZSAR-703I Jueves 01 de Noviembre del 2012 - 23:23:34
----------------------------------------------------------------------------------
ZSAR-704I ZSAR est  separando el archivo 'DATOSZSAR.TXT' en m£ltiples repositorios
          Esto puede tomar varios minutos dependiendo del tama¤o de la entrada
----------------------------------------------------------------------------------
ZSAR-707I D:\Z\$PAZO\DATOSZSAR_001.TXT creado con 01070000 Reg(s).
ZSAR-707I D:\Z\$PAZO\DATOSZSAR_002.TXT creado con 01070000 Reg(s).
ZSAR-707I D:\Z\$PAZO\DATOSZSAR_003.TXT creado con 01070000 Reg(s).
ZSAR-707I D:\Z\$PAZO\DATOSZSAR_004.TXT creado con 01070000 Reg(s).
ZSAR-707I D:\Z\$PAZO\DATOSZSAR_005.TXT creado con 01070000 Reg(s).
ZSAR-707I D:\Z\$PAZO\DATOSZSAR_006.TXT creado con 01070000 Reg(s).
ZSAR-710I D:\Z\$PAZO\DATOSZSAR_007.TXT creado con 00877500 Reg(s).
----------------------------------------------------------------------------------
ZSAR-712I 7297500 registro(s) leido(s) de:
          D:\Z\$PAZO\DATOSZSAR.TXT
ZSAR-713I 6 archivo(s) creado(s) con 1070000 registro(s) c/u
ZSAR-714I 1 archivo creado con 877500 registro(s)
ZSAR-715I 7297500 registro(s) grabado(s) en 7 archivo(s)
----------------------------------------------------------------------------------
ZSAR-716I Jueves 01 de Noviembre del 2012 - 23:35:16
ZSAR-717I Caracteristicas del archivo de entrada
           RecFm=V LRecLMin=3 LRecLMax=158
----------------------------------------------------------------------------------
ZSAR-718I Tiempo ocupado en la separaci¢n: 00:11:42
----------------------------------------------------------------------------------
Víctor Hugo Zepeda

Responder