Mercurial > mercurial > hgweb_porori.cgi
view Porori/src2/porori.go @ 1:bcbe8663e582 default tip
bug fix.
author | pyon@macmini |
---|---|
date | Fri, 14 Feb 2020 18:48:53 +0900 |
parents | 2b4fc52a96d9 |
children |
line wrap: on
line source
package main import ( "encoding/csv" "encoding/json" "fmt" "io/ioutil" "log" "os" "sort" "strings" "time" "golang.org/x/text/encoding/japanese" "golang.org/x/text/transform" ) const jsonfile = "porori.json" type Sinsei struct { No string Name string Ymd string Kbn string Ccn string Bgn string End string Term string } func (s Sinsei) String() string { return strings.Join([]string{s.No, s.Name, s.Ymd, s.Kbn, s.Bgn, s.End, s.Term, s.Ccn}, ",") } func (s Sinsei) TransDate (ymd string) (time.Time, string) { zero := time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC) if !strings.HasPrefix(ymd, "20") { return zero, "" // it's dummy } t, _ := time.Parse("20060102", ymd) return t, t.Format(" 2006-01-02") } func (s Sinsei) CountMonth(bgn, end time.Time) int { if bgn.IsZero() { return 0 } m := (end.Year() * 12 + int(end.Month())) - (bgn.Year() * 12 + int(bgn.Month())) if bgn.Day() == 1 { m++ } return m } func (s *Sinsei) ChangeExpression() { s.No = "=\"" + strings.TrimSpace(s.No) + "\"" switch s.Kbn { case "01": s.Kbn = "新規" case "02": s.Kbn = "更新" case "10": s.Kbn = "支介" case "05": s.Kbn = "区変" case "03": s.Kbn = "転入" case "09": s.Kbn = "証交" } s.Kbn, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), s.Kbn) var bgn, end time.Time _, s.Ymd = s.TransDate(s.Ymd) _, s.Ccn = s.TransDate(s.Ccn) bgn, s.Bgn = s.TransDate(s.Bgn) end, s.End = s.TransDate(s.End) s.Term = fmt.Sprintf("%d", s.CountMonth(bgn, end)) } func main() { if len(os.Args) != 2 { fmt.Fprint(os.Stderr, "bat input.") os.Exit(1) } // Filter Setting type YF struct { From string To string } var yf YF content, err := ioutil.ReadFile(jsonfile) if err != nil { log.Fatal(err) } if err := json.Unmarshal(content, &yf); err != nil { log.Fatal(err) } // Read CSV content, err = ioutil.ReadFile(os.Args[1]) if err != nil { log.Fatal(err) } r := csv.NewReader(strings.NewReader(string(content))) records, err := r.ReadAll() if err != nil { log.Fatal(err) } // Main Proccess var sinsei []Sinsei for _, record := range records { if record[4] < yf.From || record[4] > yf.To { continue } ss := Sinsei{ No: record[0], Name: record[1], Ymd: record[2], Kbn: record[3], Ccn: record[4], Bgn: record[5], End: record[6], } ss.ChangeExpression() sinsei = append(sinsei, ss) } sort.Slice(sinsei, func(i, j int) bool { return sinsei[i].Ymd < sinsei[j].Ymd }) // Output header := strings.Join([]string{"被保番", "氏名", "申請日", "区分", "開始日", "終了日", "期間", "審査会"}, ",") header, _, _ = transform.String(japanese.ShiftJIS.NewEncoder(), header) fmt.Println(header) for _, s := range sinsei { fmt.Println(s) } }