Zeit-Strings parsen
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 61 von 68.
Manchmal erhalten Sie Datums- und Zeitinformationen als Strings, die für die Verarbeitung in time.Time-Objekte konvertiert werden müssen. Go bietet die Funktion time.Parse an, um diese Konvertierung durchzuführen.
Die Funktion time.Parse arbeitet umgekehrt zur Formatierung - sie nimmt einen Layout-String und einen Zeit-String entgegen und gibt dann ein time.Time-Objekt zurück:
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)
}Genau wie bei der Formatierung verwenden Sie dieselben Referenzdatumskomponenten in Ihrem Layout-String. Das Layout "2006-01-02" weist Go an, den Eingabestring im Format YYYY-MM-DD zu erwarten. Das Layout muss exakt mit dem Format Ihres Eingabestrings übereinstimmen.
Denke daran, dass time.Parse zwei Werte zurückgibt: das analysierte time.Time-Objekt und einen Fehler. Überprüfe immer den Fehler, um sicherzustellen, dass das Parsen erfolgreich war, da ungültige Datumszeichenfolgen oder nicht übereinstimmende Layouts dazu führen, dass das Parsen fehlschlägt.
Aufgabe
EinfachErstelle einen Parser für Protokolldateien, der Zeitstempelzeichenfolgen aus verschiedenen Formaten zur Analyse in time.Time-Objekte umwandelt. Diese Herausforderung testet deine Fähigkeit, time.Parse mit verschiedenen Layoutmustern zu verwenden, um mehrere Datums- und Zeitformate zu verarbeiten, die häufig in Systemprotokollen vorkommen.
Wichtiger Hinweis: Da Protokollnachrichten und Layoutmuster Leerzeichen enthalten können, musst du bufio.Scanner verwenden, um vollständige Eingabezeilen zu lesen. Die Funktion fmt.Scanln beendet das Lesen beim ersten Leerzeichen, wodurch Protokolleinträge und Layouts mit Leerzeichen beschädigt würden. Verwende bufio.NewScanner(os.Stdin) und rufe anschließend scanner.Scan() gefolgt von scanner.Text() auf, um vollständige Zeilen zu lesen.
Du erhältst zwei Eingaben:
- Eine Zeichenfolge mit Protokolleinträgen im Format
"timestamp1:message1,timestamp2:message2,timestamp3:message3"(z. B."2023-10-26:System startup,2023/12/25:Holiday shutdown,Jan 15 2024:Maintenance window") - Eine Zeichenfolge mit durch Kommas getrennten Layoutmustern im Format
"layout1,layout2,layout3"(z. B."2006-01-02,2006/01/02,Jan 2 2006")
Deine Aufgabe ist es:
bufio.Scannerzu verwenden, um die Eingabezeilen korrekt zu lesen und Leerzeichen in Protokollnachrichten und Layoutmustern zu verarbeiten- Die erste Eingabe durch Aufteilen an Kommas zu verarbeiten, um einzelne Protokolleinträge zu erhalten
- Jeden Protokolleintrag an Doppelpunkten aufzuteilen, um die Zeitstempelzeichenfolge und die Nachricht zu extrahieren
- Die zweite Eingabe durch Aufteilen an Kommas zu verarbeiten, um Layoutmuster zu erhalten
- Den Anwendungskopf anzuzeigen:
"=== LOG TIMESTAMP PARSER ===" - Den Verarbeitungsstatus anzuzeigen:
"Processing log entries with multiple timestamp formats..." - Für jeden Protokolleintrag zu versuchen, den Zeitstempel mit jedem Layoutmuster zu analysieren, bis eines erfolgreich ist:
- Jedes Layoutmuster mit
time.Parseauszuprobieren, bis die Analyse erfolgreich ist (kein Fehler auftritt) - Bei Erfolg Folgendes anzuzeigen:
"Parsed: [timestamp_string] -> [parsed_time_object] (using layout: [successful_layout])" - Außerdem Folgendes anzuzeigen:
" Message: [log_message]" - Wenn kein Layout für einen Zeitstempel funktioniert, Folgendes anzuzeigen:
"Failed to parse: [timestamp_string] - no matching layout found"
- Jedes Layoutmuster mit
- Nach der Verarbeitung aller Einträge Verarbeitungsstatistiken anzuzeigen:
"=== PARSING RESULTS ===""Total log entries processed: [number_of_entries]""Successfully parsed timestamps: [number_of_successful_parses]""Failed parsing attempts: [number_of_failed_parses]"
- Statistiken zur Layoutverwendung anzuzeigen:
"Layout pattern usage:"- Für jedes Layoutmuster:
" [layout_pattern]: [number_of_times_used] times"
- Wenn Zeitstempel erfolgreich analysiert wurden, eine chronologische Analyse anzuzeigen:
"=== CHRONOLOGICAL ANALYSIS ===""Earliest timestamp: [earliest_parsed_time]""Latest timestamp: [latest_parsed_time]""Time span covered: [time_difference_description]"
- Die Abschlussmeldung anzuzeigen:
"Log parsing completed - timestamps converted to time objects"
Verwende das Paket time für Analysevorgänge, das Paket strings, um Eingabezeichenfolgen aufzuteilen, die Pakete bufio und os für die korrekte Eingabeverarbeitung sowie das Paket fmt für die formatierte Ausgabe. Denke daran, dass time.Parse sowohl ein time.Time-Objekt als auch einen Fehler zurückgibt – du musst den Fehler überprüfen, um festzustellen, ob die Analyse erfolgreich war. Wenn die Analyse mit einem Layout fehlschlägt, probiere das nächste Layoutmuster aus, bis du eines findest, das funktioniert, oder alle Optionen ausgeschöpft sind. Diese Herausforderung zeigt, wie mehrere Zeitstempelformate in realen Szenarien der Protokollverarbeitung verarbeitet werden.
Probier es selbst
package main
import (
"bufio"
"fmt"
"os"
"strings"
"time"
)
func main() {
// Scanner zum Lesen von Eingabezeilen erstellen
scanner := bufio.NewScanner(os.Stdin)
// Log-Einträge lesen
scanner.Scan()
logEntries := scanner.Text()
// Layout-Muster lesen
scanner.Scan()
layoutPatterns := scanner.Text()
// Eingaben parsen
entries := strings.Split(logEntries, ",")
layouts := strings.Split(layoutPatterns, ",")
// Zähler für Statistiken initialisieren
totalEntries := len(entries)
successfulParses := 0
failedParses := 0
layoutUsage := make(map[string]int)
var parsedTimes []time.Time
// TODO: Schreiben Sie Ihren Code unten
// 1. Anwendungs-Header anzeigen
// 2. Verarbeitungsstatus anzeigen
// 3. Jeden Log-Eintrag verarbeiten:
// - Eintrag bei ":" trennen, um Zeitstempel und Nachricht zu erhalten
// - Jedes Layout-Muster ausprobieren, bis eines funktioniert
// - Parsing-Ergebnisse anzeigen
// - Statistiken aktualisieren
// 4. Parsing-Statistiken anzeigen
// 5. Statistiken zur Layout-Nutzung anzeigen
// 6. Wenn Zeitstempel geparst wurden, chronologische Analyse anzeigen
// 7. Abschlussmeldung anzeigen
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen7Fehlerbehandlung im Detail
Benutzerdefinierte FehlertypenFehler-Wrapping mit `%w`Unwrapping mit `errors.Is`Unwrapping mit `errors.As``panic` verstehen`recover` verwendenZusammenfassung – Sichere Division10Arbeiten mit Zeit
Aktuelle Zeit abrufenEinen bestimmten Zeitpunkt erstellenZeit formatierenZeit-Strings parsenZeitdauerZeitarithmetikSleeping und TickerZusammenfassung – Einfacher Timer2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und VerhaltenÜbe selbstständig: Online-Go-Compiler