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):
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.