指定されたファイルから時刻表を読み込み、最も近い未来の時刻を取得します。

/*
	c:\Users\ebata\tomioka3b\others\main42.go
	指定されたファイルから時刻表を読み込み、最も近い未来の時刻を取得します。
*/
package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
	"time"
)

func main() {
	// 指定されたファイル名
	fileName := "To_Sengakuzi_weekdays.csv" // ここにファイル名を入力してください

	// 指定されたファイルから時刻表を読み込む
	schedule, err := readScheduleFromFile(fileName)
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	//fmt.Println("時刻表:", schedule)

	// 現在時刻を取得
	now := time.Now().Format("15:04:05")
	now = "12:29:00"

	// 最も近い未来の時刻を取得
	nextTime := getNextTime(schedule, now)

	// 結果を出力
	fmt.Println("最も近い未来の時刻:", nextTime)
}

func readScheduleFromFile(fileName string) ([]time.Time, error) {
	// ファイルを開く
	file, err := os.Open(fileName)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	var schedule []time.Time

	// ファイルから時刻を読み取る
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		times := strings.Split(line, ",")
		for _, t := range times {
			//fmt.Println("時刻:", t)
			t1, err := time.Parse("15:04:05", t)
			if err != nil {
				fmt.Println("時刻のパースに失敗しました:", err)
				return nil, err
			}
			schedule = append(schedule, t1)
		}
	}

	// fmt.Println("pass4")
	// fmt.Println("schedule: ", schedule)

	return schedule, nil
}

// 指定された時刻表から最も近い未来の時刻を取得する関数
func getNextTime(schedule []time.Time, inputTime string) string {
	// 入力時刻のパース
	input, err := time.Parse("15:04:05", inputTime)
	if err != nil {
		panic(err)
	}

	// 時刻表の各時刻との差を計算し、最小の差を見つける
	minDiff := time.Hour * 24
	var nextTime string
	for _, t := range schedule {
		// 時刻の差を計算
		diff := t.Sub(input)

		// 負の差(過去の時刻)を無視
		if diff < 0 {
			continue
		}

		// 最小の差を更新
		if diff < minDiff {
			minDiff = diff
			nextTime = t.Format("15:04:05")
		}
	}

	return nextTime
}

To_Sengakuzi_weekdays.csv

4:53:00
5:08:00,5:23:00,5:32:00,5:44:00,5:55:00
6:03:00,6:14:00,6:26:00,6:33:00,6:40:00,6:44:00,6:49:00,6:53:00,6:59:00
7:04:00,7:09:00,7:14:00,7:19:00,7:26:00,7:30:00,7:37:00,7:46:00,7:52:00,7:58:00
8:06:00,8:14:00,8:21:00,8:26:00,8:33:00,8:41:00,8:47:00,8:54:00
9:02:00,9:10:00,9:21:00,9:31:00,9:41:00,9:53:00
10:03:00,10:13:00,10:24:00,10:33:00,10:44:00,10:53:00
11:04:00,11:13:00,11:24:00,11:32:00,11:44:00,11:53:00
12:04:00,12:13:00,12:24:00,12:33:00,12:44:00,12:53:00
13:04:00,13:13:00,13:24:00,13:33:00,13:44:00,13:53:00
14:04:00,14:13:00,14:24:00,14:33:00,14:43:00,14:52:00
15:02:00,15:12:00,15:22:00,15:31:00,15:41:00,15:52:00
16:01:00,16:10:00,16:20:00,16:31:00,16:42:00,16:53:00
17:02:00,17:13:00,17:23:00,17:34:00,17:43:00,17:53:00,17:59:00
18:12:00,18:19:00,18:28:00,18:38:00,18:48:00,18:57:00
19:08:00,19:18:00,19:26:00,19:36:00,19:46:00,19:55:00
20:06:00,20:16:00,20:27:00,20:36:00,20:46:00,20:56:00
21:08:00,21:15:00,21:18:00,21:29:00,21:39:00,21:50:00
22:01:00,22:11:00,22:21:00,22:26:00,22:38:00,22:53:00
23:12:00,23:33:00,23:54:00

 

2024,江端さんの技術メモ

Posted by ebata