package main import ( "bufio" "fmt" "io" "os" "strconv" "strings" "time" ) const filename = "ShipParameterRecord.csv" const backuptemplate = "ShipParameterRecord-%d.csv" var stdin = bufio.NewReader(os.Stdin) func Exit(code int) { fmt.Println("Press enter to exit...") stdin.ReadBytes('\n') os.Exit(code) } func main() { if _, err := os.Stat(filename); os.IsNotExist(err) { fmt.Println("File", filename, "doesn't exist!") Exit(1) } else if err != nil { fmt.Println("Error open while stat file", filename, ":", err.Error()) Exit(254) } now := time.Now().UnixNano() backupname := fmt.Sprintf(backuptemplate, now) for { if _, err := os.Stat(backupname); os.IsNotExist(err) { break } now = time.Now().UnixNano() backupname = fmt.Sprintf(backuptemplate, now) } original, err := os.Open(filename) if err != nil { fmt.Println("Can't open file for reading:", err.Error()) Exit(1) } reader := bufio.NewReader(original) if err := os.Rename(filename, backupname); err != nil { fmt.Println("Can not rename file", filename, ":", err.Error()) Exit(1) } fmt.Println("Old file is backuped at", backupname) modified, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666) defer modified.Close() if err != nil { fmt.Println("Can't open file for writing:", err.Error()) Exit(1) } for i := 1; ; i++ { line, err := reader.ReadString('\n') if err != nil { if err == io.EOF { fmt.Printf("%d lines processed.\n", i-1) break } else { fmt.Println("Error read file:", err.Error()) Exit(1) } } else { line = strings.TrimSpace(line) } csvparts := strings.Split(line, ",") if len(csvparts) != 36 { fmt.Printf("[Line #%d] CSV should contains 36 columns, leave this line untouched.\n", i) fmt.Fprintln(modified, line) continue } n, err := strconv.ParseInt(csvparts[0], 10, 0) if err != nil { fmt.Printf("[Line #%d] Ship ID is not a number, leave this line untouched.\n", i) fmt.Fprintln(modified, line) continue } f := false if n > 500 && n < 1000 && n != 503 && n != 508 { n += 1000 f = true csvparts[0] = strconv.FormatInt(n, 10) } // Duplicate line, remove it. if n < 1500 || f { fmt.Printf("[Line #%d] Line patched.\n", i) line = strings.Join(csvparts, ",") fmt.Fprintln(modified, line) } else { fmt.Printf("[Line #%d] Duplicate line. Removed from output.\n", i) } } fmt.Println("Done!") Exit(0) }