시간 문자열 파싱
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 61번째.
때때로 처리를 위해 time.Time 객체로 변환해야 하는 문자열 형태의 날짜 및 시간 정보를 받게 됩니다. Go는 이러한 변환을 처리하기 위해 time.Parse 함수를 제공합니다.
time.Parse 함수는 포맷팅의 역순으로 작동합니다. 레이아웃 문자열과 시간 문자열을 인자로 받아 time.Time 객체를 반환합니다:
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)
}서식 지정과 마찬가지로, 레이아웃 문자열에 동일한 기준 날짜 구성 요소를 사용합니다. "2006-01-02" 레이아웃은 Go에게 입력 문자열이 YYYY-MM-DD 형식일 것임을 알려줍니다. 레이아웃은 입력 문자열의 정확한 형식과 일치해야 합니다.
time.Parse는 파싱된 time.Time 객체와 에러라는 두 개의 값을 반환한다는 점을 기억하세요. 유효하지 않은 날짜 문자열이나 일치하지 않는 레이아웃은 파싱 실패의 원인이 되므로, 파싱이 성공했는지 확인하기 위해 항상 에러를 체크해야 합니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움다양한 형식의 타임스탬프 문자열을 분석을 위해 time.Time 객체로 변환하는 로그 파일 파서(parser)를 만드세요. 이 챌린지는 시스템 로그에서 흔히 발견되는 여러 날짜 및 시간 형식을 처리하기 위해 다양한 레이아웃 패턴과 함께 time.Parse를 사용하는 능력을 테스트합니다.
중요 참고 사항: 로그 메시지와 레이아웃 패턴에는 공백이 포함될 수 있으므로, 전체 입력 라인을 읽으려면 bufio.Scanner를 사용해야 합니다. fmt.Scanln 함수는 첫 번째 공백에서 읽기를 중단하므로 공백이 포함된 로그 항목과 레이아웃이 잘릴 수 있습니다. bufio.NewScanner(os.Stdin)를 사용하고 scanner.Scan()을 호출한 뒤 scanner.Text()를 사용하여 전체 라인을 읽으세요.
두 개의 입력을 받게 됩니다:
"timestamp1:message1,timestamp2:message2,timestamp3:message3"형식의 로그 항목을 포함하는 문자열 (예:"2023-10-26:System startup,2023/12/25:Holiday shutdown,Jan 15 2024:Maintenance window")"layout1,layout2,layout3"형식으로 쉼표로 구분된 레이아웃 패턴을 포함하는 문자열 (예:"2006-01-02,2006/01/02,Jan 2 2006")
당신의 과제는 다음과 같습니다:
- 로그 메시지와 레이아웃 패턴의 공백을 적절히 처리하기 위해
bufio.Scanner를 사용하여 입력 라인을 읽습니다. - 첫 번째 입력을 쉼표로 분할하여 개별 로그 항목을 파싱합니다.
- 각 로그 항목에 대해 콜론을 기준으로 분할하여 타임스탬프 문자열과 메시지를 추출합니다.
- 두 번째 입력을 쉼표로 분할하여 레이아웃 패턴을 파싱합니다.
- 애플리케이션 헤더를 표시합니다:
"=== LOG TIMESTAMP PARSER ===" - 파싱 상태를 표시합니다:
"Processing log entries with multiple timestamp formats..." - 각 로그 항목에 대해 성공할 때까지 각 레이아웃 패턴을 사용하여 타임스탬프 파싱을 시도합니다:
- 파싱이 성공(에러 없음)할 때까지
time.Parse와 함께 각 레이아웃 패턴을 시도합니다. - 성공하면 다음을 표시합니다:
"Parsed: [timestamp_string] -> [parsed_time_object] (using layout: [successful_layout])" - 또한 다음을 표시합니다:
" Message: [log_message]" - 타임스탬프에 맞는 레이아웃이 없으면 다음을 표시합니다:
"Failed to parse: [timestamp_string] - no matching layout found"
- 파싱이 성공(에러 없음)할 때까지
- 모든 항목을 처리한 후 파싱 통계를 표시합니다:
"=== PARSING RESULTS ===""Total log entries processed: [number_of_entries]""Successfully parsed timestamps: [number_of_successful_parses]""Failed parsing attempts: [number_of_failed_parses]"
- 레이아웃 사용 통계를 표시합니다:
"Layout pattern usage:"- 각 레이아웃 패턴에 대해:
" [layout_pattern]: [number_of_times_used] times"
- 성공적으로 파싱된 타임스탬프가 있는 경우 연대순 분석을 표시합니다:
"=== CHRONOLOGICAL ANALYSIS ===""Earliest timestamp: [earliest_parsed_time]""Latest timestamp: [latest_parsed_time]""Time span covered: [time_difference_description]"
- 완료 메시지를 표시합니다:
"Log parsing completed - timestamps converted to time objects"
파싱 작업에는 time 패키지를, 입력 문자열 분할에는 strings 패키지를, 적절한 입력 처리에는 bufio 및 os 패키지를, 형식화된 출력에는 fmt 패키지를 사용하세요. time.Parse는 time.Time 객체와 에러를 모두 반환하므로, 에러를 확인하여 파싱 성공 여부를 판단해야 합니다. 하나의 레이아웃으로 파싱에 실패하면 작동하는 레이아웃을 찾거나 모든 옵션을 소진할 때까지 다음 레이아웃 패턴을 시도하세요. 이 챌린지는 실제 로그 처리 시나리오에서 여러 타임스탬프 형식을 처리하는 방법을 보여줍니다.
치트 시트
time.Parse를 사용하여 날짜/시간 문자열을 time.Time 객체로 변환합니다:
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)
}레이아웃 문자열은 Go의 기준 날짜 구성 요소를 사용하여 입력 문자열의 정확한 형식과 일치해야 합니다. time.Parse는 time.Time 객체와 에러를 모두 반환하므로, 파싱이 성공했는지 확인하기 위해 항상 에러를 확인하세요.
직접 해보기
package main
import (
"bufio"
"fmt"
"os"
"strings"
"time"
)
func main() {
// 입력 라인을 읽기 위한 스캐너 생성
scanner := bufio.NewScanner(os.Stdin)
// 로그 항목 읽기
scanner.Scan()
logEntries := scanner.Text()
// 레이아웃 패턴 읽기
scanner.Scan()
layoutPatterns := scanner.Text()
// 입력 파싱
entries := strings.Split(logEntries, ",")
layouts := strings.Split(layoutPatterns, ",")
// 통계용 카운터 초기화
totalEntries := len(entries)
successfulParses := 0
failedParses := 0
layoutUsage := make(map[string]int)
var parsedTimes []time.Time
// TODO: 아래에 코드를 작성하세요
// 1. 애플리케이션 헤더 표시
// 2. 처리 상태 표시
// 3. 각 로그 항목 처리:
// - ":"를 기준으로 항목을 분할하여 타임스탬프와 메시지 추출
// - 작동할 때까지 각 레이아웃 패턴 시도
// - 파싱 결과 표시
// - 통계 업데이트
// 4. 파싱 통계 표시
// 5. 레이아웃 사용 통계 표시
// 6. 타임스탬프가 파싱된 경우, 시간순 분석 표시
// 7. 완료 메시지 표시
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.