package seq import ( "errors" "fmt" "io/ioutil" "os" "strings" ) // 解析SEQ文件 func ParseSeqEdi(ediFile string, sequence *SEQUENCE) (err error) { var ( f *os.File fd []byte datalist []string row string rowObj string ilen int dtm DTM seq SEQ gir GIR loc LOC ) // 打开文件 if f, err = os.Open(ediFile); err != nil { goto ERR } defer f.Close() // 读取文件数据 if fd, err = ioutil.ReadAll(f); err != nil { goto ERR } // 切割数据 datalist = strings.Split(string(fd), "'") // 遍历数据,生成SEQ对象 sequence.DataRows = 0 fmt.Println("Total data row = ", len(datalist)) for _, row = range datalist { if strings.TrimSpace(row) == "" { continue } rowObj = getSeqDataRowObj(row) switch rowObj { case "UNB": if err = sequence.Unb.Parse(row); err != nil { goto ERR } case "UNH": if err = sequence.Unh.Parse(row); err != nil { goto ERR } sequence.DataRows++ case "BGM": if err = sequence.Bgm.Parse(row); err != nil { goto ERR } sequence.DataRows++ case "DTM": dtm = DTM{} if err = dtm.Parse(row); err != nil { goto ERR } // 基于日期时间类型判定是TOD还是SEQ订单时间 // 137 是TOD消息时间;194是订单开始时间 switch dtm.DateTimeType { case 137: sequence.Dtm = dtm case 42: ilen = len(sequence.SeqList) if ilen < 1 { err = errors.New("SEQ dtm is existed before the 1st SEQ!") goto ERR } sequence.SeqList[ilen-1].Dtm = dtm default: err = errors.New("Unknown datetime type in DTM : " + string(dtm.DateTimeType)) goto ERR } sequence.DataRows++ case "FTX": if err = sequence.Ftx.Parse(row); err != nil { goto ERR } sequence.DataRows++ case "NAD": if err = sequence.Nad.Parse(row); err != nil { goto ERR } sequence.DataRows++ case "SEQ": seq = SEQ{} if err = seq.Parse(row); err != nil { goto ERR } sequence.SeqList = append(sequence.SeqList, seq) sequence.DataRows++ case "GIR": gir = GIR{} if err = gir.Parse(row); err != nil { goto ERR } ilen = len(sequence.SeqList) if ilen < 1 { err = errors.New("SEQ gir is existed before the 1st SEQ!") goto ERR } sequence.SeqList[ilen-1].Gir = gir sequence.DataRows++ case "LOC": loc = LOC{} if err = loc.Parse(row); err != nil { goto ERR } ilen = len(sequence.SeqList) if ilen < 1 { err = errors.New("SEQ loc is existed before the 1st SEQ!") goto ERR } switch loc.LocType { case 44: sequence.SeqList[ilen-1].Loc44 = loc case 83: sequence.SeqList[ilen-1].Loc83 = loc } sequence.DataRows++ case "UNT": sequence.Unt = UNT{} if err = sequence.Unt.Parse(row); err != nil { goto ERR } sequence.DataRows++ case "UNZ": sequence.Unz = UNZ{} if err = sequence.Unz.Parse(row); err != nil { goto ERR } break default: err = errors.New("Unknown SEQ object : " + rowObj) goto ERR } } if sequence.Unt.DataRows != sequence.DataRows { err = errors.New(fmt.Sprintf("Unt datarows: %d is not matching the actual datarows: %d", sequence.Unt.DataRows, sequence.DataRows)) goto ERR } ERR: fmt.Println(err) return } func getSeqDataRowObj(row string) (obj string) { if len(row) < 3 { return "" } return strings.ToUpper(row[:3]) } // 打印解析的SEQ对象 func PrintSeqEdi(sequence *SEQUENCE) { var ( seq SEQ ) sequence.Unb.Print() sequence.Unh.Print() sequence.Bgm.Print() sequence.Dtm.Print() sequence.Ftx.Print() sequence.Nad.Print() for _, seq = range sequence.SeqList { seq.Print() seq.Dtm.Print() seq.Gir.Print() seq.Loc44.Print() seq.Loc83.Print() } sequence.Unt.Print() sequence.Unz.Print() }