Zaman Dizelerini Ayrıştırma
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 61 / 68.
Bazen, işlenmek üzere time.Time nesnelerine dönüştürülmesi gereken tarih ve saat bilgilerini dizeler (string) olarak alırsınız. Go, bu dönüşümü gerçekleştirmek için time.Parse fonksiyonunu sağlar.
time.Parse işlevi biçimlendirmenin tersi olarak çalışır; bir düzen dizesi ve bir zaman dizesi alır, ardından bir time.Time nesnesi döndürür:
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)
}Tıpkı biçimlendirmede olduğu gibi, düzen dizginizde aynı referans tarih bileşenlerini kullanırsınız. "2006-01-02" düzeni, Go'ya giriş dizgisini YYYY-MM-DD biçiminde beklemesini söyler. Düzen, giriş dizginizin tam biçimiyle eşleşmelidir.
time.Parse işlevinin iki değer döndürdüğünü unutmayın: ayrıştırılmış time.Time nesnesi ve bir hata. Geçersiz tarih dizeleri veya eşleşmeyen düzenler ayrıştırmanın başarısız olmasına neden olacağından, ayrıştırmanın başarılı olduğundan emin olmak için hatayı her zaman kontrol edin.
Görev
KolayAnaliz için çeşitli biçimlerdeki zaman damgası dizelerini time.Time nesnelerine dönüştüren bir günlük dosyası ayrıştırıcısı oluşturun. Bu görev, sistem günlüklerinde yaygın olarak bulunan birden fazla tarih ve saat biçimini işlemek için farklı düzen kalıplarıyla time.Parse kullanma becerinizi sınayacaktır.
Önemli Not: Günlük iletileri ve düzen kalıpları boşluk içerebileceğinden, girdinin tüm satırlarını okumak için bufio.Scanner kullanmanız gerekir. fmt.Scanln işlevi ilk boşlukta okumayı durdurur; bu da boşluk içeren günlük girdilerini ve düzenleri bozacaktır. bufio.NewScanner(os.Stdin) kullanın ve tam satırları okumak için scanner.Scan() çağrısının ardından scanner.Text() çağrısını yapın.
İki girdi alacaksınız:
"timestamp1:message1,timestamp2:message2,timestamp3:message3"biçiminde günlük girdilerini içeren bir dize (ör."2023-10-26:System startup,2023/12/25:Holiday shutdown,Jan 15 2024:Maintenance window")- Virgüllerle ayrılmış
"layout1,layout2,layout3"biçiminde düzen kalıplarını içeren bir dize (ör."2006-01-02,2006/01/02,Jan 2 2006")
Göreviniz:
- Günlük iletilerindeki ve düzen kalıplarındaki boşlukları doğru şekilde işlemek için giriş satırlarını okumak üzere
bufio.Scannerkullanın - Tek tek günlük girdilerini elde etmek için ilk girdiyi virgüllere göre bölün
- Zaman damgası dizesini ve iletiyi çıkarmak için her günlük girdisini iki noktaya göre bölün
- Düzen kalıplarını elde etmek için ikinci girdiyi virgüllere göre bölün
- Uygulama başlığını görüntüleyin:
"=== LOG TIMESTAMP PARSER ===" - Ayrıştırma durumunu görüntüleyin:
"Processing log entries with multiple timestamp formats..." - Her günlük girdisi için, biri başarılı olana kadar her düzen kalıbını kullanarak zaman damgasını ayrıştırmayı deneyin:
- Ayrıştırma başarılı olana (hata oluşmayana) kadar her düzen kalıbını
time.Parseile deneyin - Başarılı olduğunda şunu görüntüleyin:
"Parsed: [timestamp_string] -> [parsed_time_object] (using layout: [successful_layout])" - Ayrıca şunu görüntüleyin:
" Message: [log_message]" - Hiçbir düzen bir zaman damgası için işe yaramazsa şunu görüntüleyin:
"Failed to parse: [timestamp_string] - no matching layout found"
- Ayrıştırma başarılı olana (hata oluşmayana) kadar her düzen kalıbını
- Tüm girdileri işledikten sonra ayrıştırma istatistiklerini görüntüleyin:
"=== PARSING RESULTS ===""Total log entries processed: [number_of_entries]""Successfully parsed timestamps: [number_of_successful_parses]""Failed parsing attempts: [number_of_failed_parses]"
- Düzen kullanım istatistiklerini görüntüleyin:
"Layout pattern usage:"- Her düzen kalıbı için:
" [layout_pattern]: [number_of_times_used] times"
- Herhangi bir zaman damgası başarıyla ayrıştırıldıysa kronolojik analizi görüntüleyin:
"=== CHRONOLOGICAL ANALYSIS ===""Earliest timestamp: [earliest_parsed_time]""Latest timestamp: [latest_parsed_time]""Time span covered: [time_difference_description]"
- Tamamlanma iletisini görüntüleyin:
"Log parsing completed - timestamps converted to time objects"
Ayrıştırma işlemleri için time paketini, giriş dizelerini bölmek için strings paketini, uygun giriş işleme için bufio ve os paketlerini, biçimlendirilmiş çıktı için de fmt paketini kullanın. time.Parse işlevinin hem bir time.Time nesnesi hem de bir hata döndürdüğünü unutmayın; ayrıştırmanın başarılı olup olmadığını belirlemek için hatayı kontrol etmeniz gerekir. Ayrıştırma bir düzenle başarısız olursa, işe yarayan bir düzen bulana veya tüm seçenekleri tüketene kadar sonraki düzen kalıbını deneyin. Bu görev, gerçek dünya günlük işleme senaryolarında birden fazla zaman damgası biçiminin nasıl işleneceğini gösterir.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
"strings"
"time"
)
func main() {
// Giriş satırlarını okumak için tarayıcı oluştur
scanner := bufio.NewScanner(os.Stdin)
// Günlük girişlerini oku
scanner.Scan()
logEntries := scanner.Text()
// Düzen desenlerini oku
scanner.Scan()
layoutPatterns := scanner.Text()
// Girişleri ayrıştır
entries := strings.Split(logEntries, ",")
layouts := strings.Split(layoutPatterns, ",")
// İstatistikler için sayaçları başlat
totalEntries := len(entries)
successfulParses := 0
failedParses := 0
layoutUsage := make(map[string]int)
var parsedTimes []time.Time
// YAPILACAK: Kodunuzu aşağıya yazın
// 1. Uygulama başlığını görüntüle
// 2. İşleme durumunu görüntüle
// 3. Her bir günlük girişini işle:
// - Zaman damgası ve mesajı almak için girişi ":" karakterinden ayır
// - Biri çalışana kadar her düzen desenini dene
// - Ayrıştırma sonuçlarını görüntüle
// - İstatistikleri güncelle
// 4. Ayrıştırma istatistiklerini görüntüle
// 5. Düzen kullanım istatistiklerini görüntüle
// 6. Zaman damgaları ayrıştırıldıysa, kronolojik analizi görüntüle
// 7. Tamamlanma mesajını görüntüle
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme7Derinlemesine Hata Yönetimi
Özel Hata Türleri`%w` ile Hataları Sarmalama`errors.Is` ile Sarmalı Açma`errors.As` ile Sarmalı Açma`panic` Kavramını Anlamak`recover` KullanımıÖzet - Güvenli Bölme10Zamanla Çalışmak
Şu Anki Zamanı AlmaBelirli Bir Zaman OluşturmaZamanı FormatlamaZaman Dizelerini AyrıştırmaZaman SüresiZaman AritmetiğiUyutma ve Ticker'larÖzet - Basit Zamanlayıcı2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve DavranışlarKendi başına pratik yap: Online Go derleyicisi