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 fonksiyonu, biçimlendirmenin tersi olarak çalışır - bir düzen (layout) 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.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Görev
KolayÇeşitli formatlardaki zaman damgası dizelerini analiz için time.Time nesnelerine dönüştüren bir günlük dosyası ayrıştırıcısı oluşturun. Bu zorluk, sistem günlüklerinde yaygın olarak bulunan birden fazla tarih ve saat formatını işlemek için farklı düzen (layout) desenleriyle time.Parse kullanma yeteneğinizi test edecektir.
Önemli Not: Günlük mesajları ve düzen desenleri boşluk içerebileceğinden, giriş satırlarının tamamını okumak için bufio.Scanner kullanmanız gerekecektir. fmt.Scanln işlevi ilk boşlukta okumayı durdurur, bu da boşluk içeren günlük girişlerini ve düzenleri bozar. Tam satırları okumak için bufio.NewScanner(os.Stdin) kullanın ve scanner.Scan() ardından scanner.Text() çağırın.
İki giriş alacaksınız:
"timestamp1:message1,timestamp2:message2,timestamp3:message3"formatında günlük girişlerini içeren bir dize (örneğin,"2023-10-26:System startup,2023/12/25:Holiday shutdown,Jan 15 2024:Maintenance window")"layout1,layout2,layout3"formatında virgülle ayrılmış düzen desenlerini içeren bir dize (örneğin,"2006-01-02,2006/01/02,Jan 2 2006")
Göreviniz şunları yapmaktır:
- Günlük mesajlarındaki ve düzen desenlerindeki boşlukları düzgün bir şekilde işlemek için giriş satırlarını okumak üzere
bufio.Scannerkullanın - Bireysel günlük girişlerini elde etmek için ilk girişi virgüllere göre ayırarak ayrıştırın
- Her günlük girişi için, zaman damgası dizesini ve mesajı ayıklamak üzere iki noktaya göre ayırın
- Düzen desenlerini elde etmek için ikinci girişi virgüllere göre ayırarak ayrıştırı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 girişi için, biri başarılı olana kadar her bir düzen desenini kullanarak zaman damgasını ayrıştırmayı deneyin:
- Ayrıştırma başarılı olana (hata olmayana) kadar her düzen desenini
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]" - Bir zaman damgası için hiçbir düzen çalışmazsa şunu görüntüleyin:
"Failed to parse: [timestamp_string] - no matching layout found"
- Ayrıştırma başarılı olana (hata olmayana) kadar her düzen desenini
- Tüm girişleri 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 deseni 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]"
- Tamamlama mesajını görüntüleyin:
"Log parsing completed - timestamps converted to time objects"
Ayrıştırma işlemleri için time paketini, giriş dizelerini ayırmak için strings paketini, uygun giriş işleme için bufio ve os paketlerini ve formatlı çıktı için 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 etmelisiniz. Bir düzen ile ayrıştırma başarısız olduğunda, çalışan bir tane bulana veya tüm seçenekleri tüketene kadar bir sonraki düzen desenini deneyin. Bu zorluk, gerçek dünya günlük işleme senaryolarında birden fazla zaman damgası formatının nasıl ele alınacağını gösterir.
Kopya kağıdı
Tarih/saat dizelerini time.Time nesnelerine dönüştürmek için time.Parse kullanın:
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)
}Düzen (layout) dizisi, Go'nun referans tarih bileşenlerini kullanarak giriş dizinizin tam formatıyla eşleşmelidir. time.Parse hem bir time.Time nesnesi hem de bir hata döndürür - ayrıştırmanın başarılı olduğundan emin olmak için her zaman hatayı kontrol edin.
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ışlar