Tomar variables desde txt usando grupos de palabras

Iniciado por AlonsoBytes, 17 Noviembre 2014, 08:13 AM

0 Miembros y 1 Visitante están viendo este tema.

AlonsoBytes

Amigos, tengo un txt que contiene un texto de este tipo:


09B321       Alberti Ramirez, Juan    1988    CASADO 


Lo que quiero hacer es mediante un Batch hacer que cada grupo tome una variable. Es decir que la primera variable tenga como valor "09B321", la segunda (aqui viene el problema) el nombre completo "Alberti Ramirez, Juan" y asi.

Cada txt tiene una sola linea, asi que solo se leeria tal cual esta en el ejemplo, pero se me presenta el inconveniente de como hago para que el batch identifique los espacios largos y los use para tomar los datos solicitados.

*Nota: los datos varían en longitud, porque se me ocurrio usar caracteres por numeros pero no puedo porque los nombres hacen variar la longitud.

Espero haberme explicado bien. Agradezco su apoyo!!

Eleкtro

#1
Batch es una herramienta simple, no es un lenguaje capacitado para procesar un String con las condiciones que precisas, se podría hacer, pero habría que invertir bastante tiempo en el desarrollo y elaboración del algoritmo para finálmente obtener un código muy engorroso e ineficiente a diferencia de cómo se podría llevar a cabo en un lenguaje de verdad.

Podrías partir la cadena según la cantidad de espacios entre palabra y palabra, pero dijiste algo de la longitud y no se si será respecto a los espacios, así que de todas formas te sugiero una solución más global, utilizar expresiones regulares (RegEx) ya que supongo que la fecha siempre tendrá el mismo formato: 19xx o 20xx y te puedes servir en eso, aunque para esto debes recurrir a cualquier otro lenguaje que soporte RegEx (VisualBasicScripting, por ejemplo, que está integrado en cualquier Windows, aunque es otro lenguaje simple e igual de inproductivo que Batch).

Esta podría ser una expresión regular que cumpliese con tus espectativas:
(^\w+)\s+([\w\.\,\;\-\s+]+?)\s+(\d{4})\s+(\w+$)

El interior de cada paréntesis representa un grupo, cada grupo captura una palabra/token de la frase, y hay 4 grupos (4 pares de paréntesis) ya que necesitas capturar 4 tokens.


Regular expression - Wikipedia, the free encyclopedia




Te muestro un ejemplo de utilización de esa expresión regular en VisualBasic.Net, tomatelo como un pseudo-code para implementarlo en el lenguaje que prefieras, ya que la mecánica de RegEx es casi idéntica en el resto de lenguajes (no su utilización, pero si el tema de la sintaxis y los grupos):

Código (vbnet) [Seleccionar]
Imports System.Text

Public Class Form1

#Region " Regular expression "

   ' La cadena de referencia.
   ReadOnly str As String = "09B321       Alberti Ramirez, Juan    1988    CASADO"

   ' Las partes de la expresion regular.
   ReadOnly regExToken1 As String = "^\w+" ' "09B321"
   ReadOnly regExToken2 As String = "[\w\.\,\;\-\s+]+?" ' "Alberti Ramirez, Juan"
   ReadOnly regExToken3 As String = "\d{4}" ' "1988"
   ReadOnly regExToken4 As String = "\w+$" ' "CASADO"

   ' La expresión regular completa.
   ' (^\w+)\s+([\w\.\,\;\-\s+]+?)\s+(\d{4})\s+(\w+$)
   ReadOnly fullEx = String.Format("({0})\s+({1})\s+({2})\s+({3})",
                                   regExToken1, regExToken2, regExToken3, regExToken4)

   ' La instancia del motor RegEx.
   ReadOnly regEx As New RegularExpressions.Regex(fullEx, RegularExpressions.RegexOptions.Singleline)

   ' Las capturas de cada token/grupo de la expresión regular.
   ReadOnly regExGroup1 As RegularExpressions.Group = regEx.Match(str).Groups(1)
   ReadOnly regExGroup2 As RegularExpressions.Group = regEx.Match(str).Groups(2)
   ReadOnly regExGroup3 As RegularExpressions.Group = regEx.Match(str).Groups(3)
   ReadOnly regExGroup4 As RegularExpressions.Group = regEx.Match(str).Groups(4)

#End Region

   Private Shadows Sub Load() Handles MyBase.Load

       Dim sb As New StringBuilder
       With sb
           .AppendLine(String.Format("Token 1: '{0}'", regExGroup1.Value))
           .AppendLine(String.Format("Token 2: '{0}'", regExGroup2.Value))
           .AppendLine(String.Format("Token 3: '{0}'", regExGroup3.Value))
           .AppendLine(String.Format("Token 4: '{0}'", regExGroup4.Value))
       End With

       MessageBox.Show(sb.ToString, "Capturas RegEx", MessageBoxButtons.OK, MessageBoxIcon.Information)

   End Sub

End Class





Saludos.