|
|
- 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()
- }
|