Como separar letras de números de una cadena

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • lissecita
    Junior Member
    • jul
    • 22

    #1

    Como separar letras de números de una cadena

    Buenos días,

    Tengo una cadena de caracteres donde tiene letras iniciando y luego números, necesito sacar aparte las letras y aparte los números pero, las letras no son siempre las mismas ni la misma cantidad, alguien conoce una función en abap sap para poder separar las letras de los números??
  • Mauricio Hidalgo
    Senior Member
    • may
    • 481

    #2
    No tengo una función pero esto debiera servirte como base.

    data letranumero type string.
    data letras type string.
    data numeros type p decimals 0.
    data cnumeros type string.
    data offset type i.

    letranumero = 'ABCDYYTRE334425632'.

    FIND REGEX '[0-9]' in letranumero MATCH OFFSET offset.
    letras = letranumero(offset).
    numeros = letranumero+offset.
    cnumeros = letranumero+offset.

    write / letranumero.
    write / numeros.
    write / cnumeros.
    write / letras.

    Saludos
    Editado por última vez por Mauricio Hidalgo; 08/07/2013, 18:34:37.

    Comentario

    • lissecita
      Junior Member
      • jul
      • 22

      #3
      Originalmente publicado por Mauricio Hidalgo
      No tengo una función pero esto debiera servirte como base.

      data letranumero type string.
      data letras type string.
      data numeros type p decimals 0.
      data cnumeros type string.
      data offset type i.

      letranumero = 'ABCDYYTRE334425632'.

      FIND REGEX '[0-9]' in letranumero MATCH OFFSET offset.
      letras = letranumero(offset).
      numeros = letranumero+offset.
      cnumeros = letranumero+offset.

      write / letranumero.
      write / numeros.
      write / cnumeros.
      write / letras.

      Saludos

      Oyeee muchas gracias funciono perfecto pero queria preguntarte algo es que soy muy nueva en sap y apenas estoy aprendiendo... me salio un pequeño inconveniente tengo un registro que es 1215CSXD56245 .... que debo cambiar....???

      Comentario

      • Mauricio Hidalgo
        Senior Member
        • may
        • 481

        #4
        Cambio la especificación entonces:


        data letranumero type string.

        data letras type string.
        data cnumeros type string.

        letranumero = '12159CSXD56245'.

        write / letranumero.

        while strlen( letranumero ) > 0.
        if letranumero(1) CO '0123456789'.
        concatenate letras letranumero(1) into letras.
        else.
        concatenate cnumeros letranumero(1) into cnumeros.
        endif.
        shift letranumero by 1 places left.
        endwhile.

        write / cnumeros.
        write / letras.

        Espero te ayude
        Editado por última vez por Mauricio Hidalgo; 09/07/2013, 14:46:17.

        Comentario

        • lissecita
          Junior Member
          • jul
          • 22

          #5
          Gracias!!

          Mauricio muchas gracias ya lo coloque y funciono perfecto! muchísimas gracias por tu colaboración... aprendí dos cosas nueva contigo

          Comentario

          • lissecita
            Junior Member
            • jul
            • 22

            #6
            Pregunta

            Originalmente publicado por Mauricio Hidalgo
            Cambio la especificación entonces:


            data letranumero type string.

            data letras type string.
            data cnumeros type string.

            letranumero = '12159CSXD56245'.

            write / letranumero.

            while strlen( letranumero ) > 0.
            if letranumero(1) CO '0123456789'.
            concatenate letras letranumero(1) into letras.
            else.
            concatenate cnumeros letranumero(1) into cnumeros.
            endif.
            shift letranumero by 1 places left.
            endwhile.

            write / cnumeros.
            write / letras.

            Espero te ayude

            Mauricio una pregunta esto funciona perfecto pero en el caso en que el cliente requiera que se deje de esta manera letras = 12159CSXD y números = 56245, osea que los números que inician hagan parte de las letras y que después de las letras queden los números, se podría con este código colocar de esa manera???

            Comentario

            • Mauricio Hidalgo
              Senior Member
              • may
              • 481

              #7
              La expresión regular de la solución adjunta considera que un alfanumerico es la combinación de cero o más numeros seguidos de 1 o más letras mayusculas o mínusculas en tanto que los numeros será la secuencia de 1 o más digitos:

              alfanumerico = [0-9]*[A-Z|a-z]+
              numero = [0-9]+


              Cualquier otra cosa, incorporar espacios y cualquier otro caracter que necesites considerar o incluso que el string comienze con letras y luego números como alfanumerico tendrás que modificar la expresión regular.

              Querdaría algo asi entonces:

              data letranumero type string.
              data offset type i.
              data largo type i.
              data letras type string.
              data cnumeros type string.

              letranumero = '12159CSXD56245'.

              FIND REGEX '[0-9]*[A-Za-z]+' in letranumero MATCH OFFSET offset MATCH LENGTH largo.
              letras = letranumero+offset(largo).
              FIND REGEX '[0-9]+' in letranumero MATCH OFFSET offset MATCH LENGTH largo.
              cnumeros = letranumero+offset(largo).

              write / letranumero.
              write / letras.
              write / cnumeros.
              Editado por última vez por Mauricio Hidalgo; 10/07/2013, 19:36:08.

              Comentario

              • lissecita
                Junior Member
                • jul
                • 22

                #8


                Mauricio acabo de probar pero cuando pasa me dice por ejemplo de este caso 1CR6134 que letras es 1CR y el largo es 1 y me coloca el numero 1.

                Comentario

                • Mauricio Hidalgo
                  Senior Member
                  • may
                  • 481

                  #9
                  Oka, dejalo asi:


                  data letranumero type string.
                  data offset type i.
                  data largo type i.
                  data letras type string.
                  data cnumeros type string.

                  letranumero = '1CR6134'.

                  FIND REGEX '[0-9]*[A-Za-z]+' in letranumero MATCH OFFSET offset MATCH LENGTH largo.
                  letras = letranumero+offset(largo).
                  cnumeros = letranumero+largo.

                  write / letranumero.
                  write / letras.
                  write / cnumeros.

                  Comentario

                  • lissecita
                    Junior Member
                    • jul
                    • 22

                    #10
                    Pregunta

                    Cuando hablas que se pueden incorporar cualquier otro carácter, dices que hay que modificar la expresión eso seria en el caso que se presentara el caso de algo así letrasnumero = 12CDF23N-2653256 seria fácil decir que el delimitador es '-' y el resto es el numero???

                    Comentario

                    • Mauricio Hidalgo
                      Senior Member
                      • may
                      • 481

                      #11
                      osea si hubiese un delimitador todo más facil. Pero si el "-" fuese parte de lo que se concidera alfanumerico hay que incorporarlo a la expresión regular.

                      Comentario

                      • maria22_
                        Junior Member
                        • oct
                        • 16

                        #12
                        Hola,
                        solo quería decir que a mi también me sirvio mucho el código aportado (segunda versión), solo que donde cnumero puse letras y viceversa porque en el resultado me ponía por ejemplo:

                        12A

                        Letras: 12
                        Numeros: A

                        es decir, solo había que intercambiar las variables.

                        Gracias Mauricio!!!

                        Comentario

                        Trabajando...