Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Analiz 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:

  1. 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.Scanner kullanın
  2. Tek tek günlük girdilerini elde etmek için ilk girdiyi virgüllere göre bölün
  3. Zaman damgası dizesini ve iletiyi çıkarmak için her günlük girdisini iki noktaya göre bölün
  4. Düzen kalıplarını elde etmek için ikinci girdiyi virgüllere göre bölün
  5. Uygulama başlığını görüntüleyin: "=== LOG TIMESTAMP PARSER ==="
  6. Ayrıştırma durumunu görüntüleyin: "Processing log entries with multiple timestamp formats..."
  7. 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.Parse ile 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"
  8. 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]"
  9. 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"
  10. 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]"
  11. 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
	
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Go derleyicisi