Menu
Coddy logo textTech

Parsing de cadenas de tiempo

Parte de la sección Lógica y Flujo del Journey de GO de Coddy. Lección 61 de 68.

A veces recibirás información de fecha y hora como cadenas que necesitan ser convertidas en objetos time.Time para su procesamiento. Go proporciona la función time.Parse para manejar esta conversión.

La función time.Parse funciona como lo inverso al formateo: toma una cadena de diseño y una cadena de tiempo, y luego devuelve un objeto time.Time:

dateString := "2023-10-26"
parsedTime, err := time.Parse("2006-01-02", dateString)
if err != nil {
    fmt.Println("Error parsing time:", err)
} else {
    fmt.Println(parsedTime)
}

Al igual que con el formato, usas los mismos componentes de fecha de referencia en tu cadena de diseño. El diseño "2006-01-02" indica a Go que espere la cadena de entrada en formato YYYY-MM-DD. El diseño debe coincidir con el formato exacto de tu cadena de entrada.

Recuerda que time.Parse devuelve dos valores: el objeto time.Time analizado y un error. Comprueba siempre el error para asegurarte de que el análisis se realizó correctamente, ya que las cadenas de fecha no válidas o los diseños que no coinciden harán que el análisis falle.

challenge icon

Desafío

Fácil

Crea un analizador de archivos de registro que convierta cadenas de marcas de tiempo de varios formatos en objetos time.Time para su análisis. Este desafío pondrá a prueba tu capacidad para usar time.Parse con diferentes patrones de diseño para manejar múltiples formatos de fecha y hora que se encuentran habitualmente en los registros del sistema.

Nota importante: Como los mensajes de registro y los patrones de diseño pueden contener espacios, tendrás que usar bufio.Scanner para leer líneas de entrada completas. La función fmt.Scanln deja de leer en el primer espacio, lo que interrumpiría las entradas de registro y los diseños con espacios. Usa bufio.NewScanner(os.Stdin) y llama a scanner.Scan() seguido de scanner.Text() para leer líneas completas.

Recibirás dos entradas:

  • Una cadena que contiene entradas de registro con el formato "timestamp1:message1,timestamp2:message2,timestamp3:message3" (por ejemplo, "2023-10-26:System startup,2023/12/25:Holiday shutdown,Jan 15 2024:Maintenance window")
  • Una cadena que contiene patrones de diseño separados por comas con el formato "layout1,layout2,layout3" (por ejemplo, "2006-01-02,2006/01/02,Jan 2 2006")

Tu tarea es:

  1. Usar bufio.Scanner para leer correctamente las líneas de entrada y gestionar los espacios en los mensajes de registro y los patrones de diseño
  2. Analizar la primera entrada dividiéndola por comas para obtener las entradas de registro individuales
  3. Para cada entrada de registro, dividir por dos puntos para extraer la cadena de marca de tiempo y el mensaje
  4. Analizar la segunda entrada dividiéndola por comas para obtener los patrones de diseño
  5. Mostrar el encabezado de la aplicación: "=== LOG TIMESTAMP PARSER ==="
  6. Mostrar el estado del análisis: "Processing log entries with multiple timestamp formats..."
  7. Para cada entrada de registro, intentar analizar la marca de tiempo usando cada patrón de diseño hasta que uno funcione:
    • Probar cada patrón de diseño con time.Parse hasta que el análisis sea correcto (sin errores)
    • Cuando tenga éxito, mostrar: "Parsed: [timestamp_string] -> [parsed_time_object] (using layout: [successful_layout])"
    • Mostrar también: " Message: [log_message]"
    • Si ningún diseño funciona para una marca de tiempo, mostrar: "Failed to parse: [timestamp_string] - no matching layout found"
  8. Después de procesar todas las entradas, mostrar las estadísticas del análisis:
    • "=== PARSING RESULTS ==="
    • "Total log entries processed: [number_of_entries]"
    • "Successfully parsed timestamps: [number_of_successful_parses]"
    • "Failed parsing attempts: [number_of_failed_parses]"
  9. Mostrar las estadísticas de uso de los diseños:
    • "Layout pattern usage:"
    • Para cada patrón de diseño: " [layout_pattern]: [number_of_times_used] times"
  10. Si alguna marca de tiempo se analizó correctamente, mostrar el análisis cronológico:
    • "=== CHRONOLOGICAL ANALYSIS ==="
    • "Earliest timestamp: [earliest_parsed_time]"
    • "Latest timestamp: [latest_parsed_time]"
    • "Time span covered: [time_difference_description]"
  11. Mostrar el mensaje de finalización: "Log parsing completed - timestamps converted to time objects"

Usa el paquete time para las operaciones de análisis, el paquete strings para dividir las cadenas de entrada, los paquetes bufio y os para gestionar correctamente la entrada, y el paquete fmt para la salida con formato. Recuerda que time.Parse devuelve tanto un objeto time.Time como un error; debes comprobar el error para determinar si el análisis se realizó correctamente. Cuando el análisis falle con un diseño, prueba el siguiente patrón de diseño hasta encontrar uno que funcione o agotar todas las opciones. Este desafío demuestra cómo gestionar múltiples formatos de marcas de tiempo en escenarios reales de procesamiento de registros.

Pruébalo tú mismo

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
	"time"
)

func main() {
	// Crear un escáner para leer las líneas de entrada
	scanner := bufio.NewScanner(os.Stdin)
	
	// Leer las entradas del registro (log)
	scanner.Scan()
	logEntries := scanner.Text()
	
	// Leer los patrones de diseño (layout)
	scanner.Scan()
	layoutPatterns := scanner.Text()
	
	// Analizar las entradas
	entries := strings.Split(logEntries, ",")
	layouts := strings.Split(layoutPatterns, ",")
	
	// Inicializar contadores para las estadísticas
	totalEntries := len(entries)
	successfulParses := 0
	failedParses := 0
	layoutUsage := make(map[string]int)
	var parsedTimes []time.Time
	
	// TODO: Escribe tu código a continuación
	// 1. Mostrar el encabezado de la aplicación
	// 2. Mostrar el estado del procesamiento
	// 3. Procesar cada entrada del registro:
	//    - Dividir la entrada en ":" para obtener la marca de tiempo y el mensaje
	//    - Probar cada patrón de diseño hasta que uno funcione
	//    - Mostrar los resultados del análisis
	//    - Actualizar las estadísticas
	// 4. Mostrar las estadísticas de análisis
	// 5. Mostrar las estadísticas de uso de los diseños
	// 6. Si se analizaron las marcas de tiempo, mostrar el análisis cronológico
	// 7. Mostrar el mensaje de finalización
	
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo

Practica por tu cuenta: Compilador de Go online