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.
Beachten Sie, dass time.Parse zwei Werte zurückgibt: das geparste time.Time-Objekt und einen Fehler. Prüfen Sie den Fehler immer, um sicherzustellen, dass das Parsing erfolgreich war, da ungültige Datumszeichenfolgen oder nicht übereinstimmende Layouts dazu führen, dass das Parsing fehlschlägt.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Aufgabe
EinfachErstellen Sie einen Logdatei-Parser, der Zeitstempel-Strings aus verschiedenen Formaten zur Analyse in time.Time-Objekte umwandelt. Diese Herausforderung testet Ihre Fähigkeit, time.Parse mit verschiedenen Layout-Mustern zu verwenden, um mehrere Datums- und Zeitformate zu verarbeiten, die häufig in Systemprotokollen vorkommen.
Wichtiger Hinweis: Da Log-Nachrichten und Layout-Muster Leerzeichen enthalten können, müssen Sie bufio.Scanner verwenden, um ganze Eingabezeilen zu lesen. Die Funktion fmt.Scanln stoppt das Lesen beim ersten Leerzeichen, was Log-Einträge und Layouts mit Leerzeichen unterbrechen würde. Verwenden Sie bufio.NewScanner(os.Stdin) und rufen Sie scanner.Scan() gefolgt von scanner.Text() auf, um vollständige Zeilen zu lesen.
Sie erhalten zwei Eingaben:
- Einen String, der Log-Einträge im Format
"timestamp1:message1,timestamp2:message2,timestamp3:message3"enthält (z. B."2023-10-26:System startup,2023/12/25:Holiday shutdown,Jan 15 2024:Maintenance window") - Einen String, der Layout-Muster durch Kommas getrennt im Format
"layout1,layout2,layout3"enthält (z. B."2006-01-02,2006/01/02,Jan 2 2006")
Ihre Aufgabe ist es:
- Verwenden Sie
bufio.Scanner, um die Eingabezeilen korrekt zu lesen, um Leerzeichen in Log-Nachrichten und Layout-Mustern zu verarbeiten - Verarbeiten Sie die erste Eingabe, indem Sie sie an Kommas aufteilen, um einzelne Log-Einträge zu erhalten
- Teilen Sie für jeden Log-Eintrag den String an Doppelpunkten auf, um den Zeitstempel-String und die Nachricht zu extrahieren
- Verarbeiten Sie die zweite Eingabe, indem Sie sie an Kommas aufteilen, um die Layout-Muster zu erhalten
- Zeigen Sie den Anwendungs-Header an:
"=== LOG TIMESTAMP PARSER ===" - Zeigen Sie den Verarbeitungsstatus an:
"Processing log entries with multiple timestamp formats..." - Versuchen Sie für jeden Log-Eintrag, den Zeitstempel mit jedem Layout-Muster zu parsen, bis eines erfolgreich ist:
- Probieren Sie jedes Layout-Muster mit
time.Parseaus, bis das Parsen erfolgreich ist (kein Fehler) - Bei Erfolg zeigen Sie an:
"Parsed: [timestamp_string] -> [parsed_time_object] (using layout: [successful_layout])" - Zeigen Sie außerdem an:
" Message: [log_message]" - Wenn kein Layout für einen Zeitstempel funktioniert, zeigen Sie an:
"Failed to parse: [timestamp_string] - no matching layout found"
- Probieren Sie jedes Layout-Muster mit
- Nach der Verarbeitung aller Einträge zeigen Sie die Parsing-Statistiken an:
"=== PARSING RESULTS ===""Total log entries processed: [number_of_entries]""Successfully parsed timestamps: [number_of_successful_parses]""Failed parsing attempts: [number_of_failed_parses]"
- Zeigen Sie Statistiken zur Layout-Nutzung an:
"Layout pattern usage:"- Für jedes Layout-Muster:
" [layout_pattern]: [number_of_times_used] times"
- Falls Zeitstempel erfolgreich geparst wurden, zeigen Sie eine chronologische Analyse an:
"=== CHRONOLOGICAL ANALYSIS ===""Earliest timestamp: [earliest_parsed_time]""Latest timestamp: [latest_parsed_time]""Time span covered: [time_difference_description]"
- Zeigen Sie die Abschlussmeldung an:
"Log parsing completed - timestamps converted to time objects"
Verwenden Sie das time-Paket für Parsing-Operationen, das strings-Paket zum Aufteilen von Eingabestrings, die Pakete bufio und os für die korrekte Eingabeverarbeitung und das fmt-Paket für die formatierte Ausgabe. Denken Sie daran, dass time.Parse sowohl ein time.Time-Objekt als auch einen Fehler zurückgibt – Sie müssen den Fehler prüfen, um festzustellen, ob das Parsen erfolgreich war. Wenn das Parsen mit einem Layout fehlschlägt, versuchen Sie das nächste Layout-Muster, bis Sie eines finden, das funktioniert, oder alle Optionen ausgeschöpft sind. Diese Herausforderung zeigt, wie man mit mehreren Zeitstempelformaten in realen Log-Verarbeitungsszenarien umgeht.
Spickzettel
Verwenden Sie time.Parse, um Datums-/Uhrzeit-Strings in time.Time-Objekte zu konvertieren:
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)
}Der Layout-String muss exakt dem Format Ihres Eingabe-Strings entsprechen, wobei die Referenzdatum-Komponenten von Go verwendet werden. time.Parse gibt sowohl ein time.Time-Objekt als auch einen Fehler zurück – überprüfen Sie den Fehler immer, um sicherzustellen, dass das Parsen erfolgreich war.
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