Menu
Coddy logo textTech

Parsing de chaînes de temps

Fait partie de la section Logique & Flux du Journey GO de Coddy. Leçon 61 sur 68.

Parfois, vous recevrez des informations de date et d'heure sous forme de chaînes de caractères qui doivent être converties en objets time.Time pour être traitées. Go fournit la fonction time.Parse pour gérer cette conversion.

La fonction time.Parse fonctionne à l’inverse du formatage : elle prend une chaîne de modèle et une chaîne temporelle, puis renvoie un objet 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)
}

Tout comme pour le formatage, vous utilisez les mêmes composants de date de référence dans votre chaîne de mise en page. La mise en page "2006-01-02" indique à Go d'attendre la chaîne d'entrée au format YYYY-MM-DD. La mise en page doit correspondre exactement au format de votre chaîne d'entrée.

Rappelez-vous que time.Parse renvoie deux valeurs : l’objet time.Time analysé et une erreur. Vérifiez toujours l’erreur pour vous assurer que l’analyse a réussi, car les chaînes de date invalides ou les formats qui ne correspondent pas entraîneront l’échec de l’analyse.

challenge icon

Défi

Facile

Créez un analyseur de fichiers journaux qui convertit des chaînes d’horodatage de différents formats en objets time.Time pour analyse. Ce défi mettra à l’épreuve votre capacité à utiliser time.Parse avec différents modèles de format afin de gérer plusieurs formats de date et d’heure couramment utilisés dans les journaux système.

Remarque importante : Comme les messages des journaux et les modèles de format peuvent contenir des espaces, vous devrez utiliser bufio.Scanner pour lire des lignes d’entrée entières. La fonction fmt.Scanln cesse de lire au premier espace, ce qui interromprait les entrées de journal et les modèles contenant des espaces. Utilisez bufio.NewScanner(os.Stdin) et appelez scanner.Scan(), puis scanner.Text() pour lire les lignes complètes.

Vous recevrez deux entrées :

  • Une chaîne contenant des entrées de journal au format "timestamp1:message1,timestamp2:message2,timestamp3:message3" (par exemple : "2023-10-26:System startup,2023/12/25:Holiday shutdown,Jan 15 2024:Maintenance window")
  • Une chaîne contenant des modèles de format séparés par des virgules au format "layout1,layout2,layout3" (par exemple : "2006-01-02,2006/01/02,Jan 2 2006")

Votre tâche consiste à :

  1. Utiliser bufio.Scanner pour lire correctement les lignes d’entrée afin de gérer les espaces dans les messages des journaux et les modèles de format
  2. Analyser la première entrée en la séparant sur les virgules pour obtenir les différentes entrées de journal
  3. Pour chaque entrée de journal, la séparer sur les deux-points afin d’extraire la chaîne d’horodatage et le message
  4. Analyser la deuxième entrée en la séparant sur les virgules pour obtenir les modèles de format
  5. Afficher l’en-tête de l’application : "=== LOG TIMESTAMP PARSER ==="
  6. Afficher l’état de l’analyse : "Processing log entries with multiple timestamp formats..."
  7. Pour chaque entrée de journal, tenter d’analyser l’horodatage avec chaque modèle de format jusqu’à ce que l’un d’eux réussisse :
    • Essayer chaque modèle de format avec time.Parse jusqu’à ce que l’analyse réussisse (sans erreur)
    • En cas de réussite, afficher : "Parsed: [timestamp_string] -> [parsed_time_object] (using layout: [successful_layout])"
    • Afficher également : " Message: [log_message]"
    • Si aucun modèle ne fonctionne pour un horodatage, afficher : "Failed to parse: [timestamp_string] - no matching layout found"
  8. Après avoir traité toutes les entrées, afficher les statistiques d’analyse :
    • "=== PARSING RESULTS ==="
    • "Total log entries processed: [number_of_entries]"
    • "Successfully parsed timestamps: [number_of_successful_parses]"
    • "Failed parsing attempts: [number_of_failed_parses]"
  9. Afficher les statistiques d’utilisation des modèles de format :
    • "Layout pattern usage:"
    • Pour chaque modèle de format : " [layout_pattern]: [number_of_times_used] times"
  10. Si des horodatages ont été analysés avec succès, afficher l’analyse chronologique :
    • "=== CHRONOLOGICAL ANALYSIS ==="
    • "Earliest timestamp: [earliest_parsed_time]"
    • "Latest timestamp: [latest_parsed_time]"
    • "Time span covered: [time_difference_description]"
  11. Afficher le message de fin : "Log parsing completed - timestamps converted to time objects"

Utilisez le package time pour les opérations d’analyse, le package strings pour séparer les chaînes d’entrée, les packages bufio et os pour gérer correctement les entrées, ainsi que le package fmt pour la sortie formatée. N’oubliez pas que time.Parse renvoie à la fois un objet time.Time et une erreur : vous devez vérifier l’erreur pour déterminer si l’analyse a réussi. Lorsque l’analyse échoue avec un modèle, essayez le modèle suivant jusqu’à trouver celui qui fonctionne ou jusqu’à épuiser toutes les options. Ce défi montre comment gérer plusieurs formats d’horodatage dans des scénarios réels de traitement de journaux.

Essayez vous-même

package main

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

func main() {
	// Créer un scanner pour lire les lignes d'entrée
	scanner := bufio.NewScanner(os.Stdin)
	
	// Lire les entrées de journal
	scanner.Scan()
	logEntries := scanner.Text()
	
	// Lire les modèles de mise en page
	scanner.Scan()
	layoutPatterns := scanner.Text()
	
	// Analyser les entrées
	entries := strings.Split(logEntries, ",")
	layouts := strings.Split(layoutPatterns, ",")
	
	// Initialiser les compteurs pour les statistiques
	totalEntries := len(entries)
	successfulParses := 0
	failedParses := 0
	layoutUsage := make(map[string]int)
	var parsedTimes []time.Time
	
	// TODO: Écrivez votre code ci-dessous
	// 1. Afficher l'en-tête de l'application
	// 2. Afficher le statut du traitement
	// 3. Traiter chaque entrée de journal :
	//    - Diviser l'entrée sur ":" pour obtenir l'horodatage et le message
	//    - Essayer chaque modèle de mise en page jusqu'à ce qu'un fonctionne
	//    - Afficher les résultats de l'analyse
	//    - Mettre à jour les statistiques
	// 4. Afficher les statistiques d'analyse
	// 5. Afficher les statistiques d'utilisation des modèles
	// 6. Si des horodatages ont été analysés, afficher l'analyse chronologique
	// 7. Afficher le message de fin
	
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique & Flux

Entraînez-vous par vous-même : Compilateur Go en ligne