package lab
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
/** LAB文件解析器,将LAB文件解析成预定义的数据格式以便于后续的数据处理 **/
|
|
// 解析LAB文件
|
|
func ParseLabEdi(ediFile string, lab *LAB) (err error) {
|
|
var (
|
|
f *os.File
|
|
fd []byte
|
|
datalist []string
|
|
row string
|
|
rowObj string
|
|
ard ARD
|
|
pdi PDI
|
|
sad SAD
|
|
dst DST
|
|
pdn PDN
|
|
sid SID
|
|
del DEL
|
|
adi ADI
|
|
ftx FTX
|
|
ilen int
|
|
)
|
|
// 打开文件
|
|
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), "'")
|
|
|
|
// 遍历数据,生成TOD对象
|
|
lab.DataRows = 0
|
|
fmt.Println("Total data row = ", len(datalist))
|
|
for _, row = range datalist {
|
|
if strings.TrimSpace(row) == "" {
|
|
continue
|
|
}
|
|
rowObj = getLabDataRowObj(row)
|
|
switch rowObj {
|
|
case "UNB":
|
|
if err = lab.Unb.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
case "UNH":
|
|
if err = lab.Unh.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
lab.DataRows++
|
|
case "MID":
|
|
if err = lab.Mid.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
lab.DataRows++
|
|
case "SDT":
|
|
if err = lab.Sdt.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
lab.DataRows++
|
|
case "BDT":
|
|
if err = lab.Bdt.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
lab.DataRows++
|
|
case "CSG":
|
|
if err = lab.Csg.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
lab.DataRows++
|
|
case "ARD":
|
|
ard = ARD{}
|
|
if err = ard.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
lab.ArdList = append(lab.ArdList, ard)
|
|
lab.DataRows++
|
|
case "PDI":
|
|
pdi = PDI{}
|
|
if err = pdi.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
ilen = len(lab.ArdList)
|
|
if ilen < 1 {
|
|
err = errors.New("LAB PDI is existed before the 1st ARD!")
|
|
goto ERR
|
|
}
|
|
lab.ArdList[ilen-1].Pdi = pdi
|
|
lab.DataRows++
|
|
case "SAD":
|
|
sad = SAD{}
|
|
if err = sad.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
ilen = len(lab.ArdList)
|
|
if ilen < 1 {
|
|
err = errors.New("LAB SAD is existed before the 1st ARD!")
|
|
goto ERR
|
|
}
|
|
lab.ArdList[ilen-1].Sad = sad
|
|
lab.DataRows++
|
|
case "DST":
|
|
dst = DST{}
|
|
if err = dst.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
ilen = len(lab.ArdList)
|
|
if ilen < 1 {
|
|
err = errors.New("LAB DST is existed before the 1st ARD!")
|
|
goto ERR
|
|
}
|
|
lab.ArdList[ilen-1].Dst = dst
|
|
lab.DataRows++
|
|
case "PDN":
|
|
pdn = PDN{}
|
|
if err = pdn.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
ilen = len(lab.ArdList)
|
|
if ilen < 1 {
|
|
err = errors.New("LAB PDN is existed before the 1st ARD!")
|
|
goto ERR
|
|
}
|
|
lab.ArdList[ilen-1].Pdn = pdn
|
|
lab.DataRows++
|
|
case "SID":
|
|
sid = SID{}
|
|
if err = sid.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
ilen = len(lab.ArdList)
|
|
if ilen < 1 {
|
|
err = errors.New("LAB SID is existed before the 1st ARD!")
|
|
goto ERR
|
|
}
|
|
lab.ArdList[ilen-1].SidList = append(lab.ArdList[ilen-1].SidList, sid)
|
|
lab.DataRows++
|
|
case "DEL":
|
|
del = DEL{}
|
|
if err = del.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
ilen = len(lab.ArdList)
|
|
if ilen < 1 {
|
|
err = errors.New("LAB DEL is existed before the 1st ARD!")
|
|
goto ERR
|
|
}
|
|
lab.ArdList[ilen-1].DelList = append(lab.ArdList[ilen-1].DelList, del)
|
|
lab.DataRows++
|
|
case "ADI":
|
|
adi = ADI{}
|
|
if err = adi.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
ilen = len(lab.ArdList)
|
|
if ilen < 1 {
|
|
err = errors.New("LAB ADI is existed before the 1st ARD!")
|
|
goto ERR
|
|
}
|
|
lab.ArdList[ilen-1].Adi = adi
|
|
lab.DataRows++
|
|
case "FTX":
|
|
ftx = FTX{}
|
|
if err = ftx.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
lab.FtxList = append(lab.FtxList, ftx)
|
|
lab.DataRows++
|
|
case "UNT":
|
|
lab.Unt = UNT{}
|
|
if err = lab.Unt.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
lab.DataRows++
|
|
case "UNZ":
|
|
lab.Unz = UNZ{}
|
|
if err = lab.Unz.Parse(row); err != nil {
|
|
goto ERR
|
|
}
|
|
break
|
|
default:
|
|
err = errors.New("Unknown LAB object : " + rowObj)
|
|
goto ERR
|
|
}
|
|
}
|
|
if lab.Unt.MsgId != lab.Unh.MsgId {
|
|
err = errors.New(fmt.Sprintf("Unt MsgId: %s is not matching Unh MsgId: %s", lab.Unt.MsgId, lab.Unh.MsgId))
|
|
goto ERR
|
|
}
|
|
if lab.Unz.MsgRefId != lab.Unb.MsgRefId {
|
|
err = errors.New(fmt.Sprintf("Unz MsgRefId: %s is not matching Unh MsgRefId: %s", lab.Unz.MsgRefId, lab.Unb.MsgRefId))
|
|
goto ERR
|
|
}
|
|
if lab.Unt.DataRows != lab.DataRows {
|
|
err = errors.New(fmt.Sprintf("Unt datarows: %d is not matching the actual datarows: %d", lab.Unt.DataRows, lab.DataRows))
|
|
goto ERR
|
|
}
|
|
|
|
ERR:
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
func getLabDataRowObj(row string) (obj string) {
|
|
if len(row) < 3 {
|
|
return ""
|
|
}
|
|
return strings.ToUpper(row[:3])
|
|
}
|
|
|
|
// 打印解析的LAB对象
|
|
func PrintLabEdi(lab *LAB) {
|
|
var (
|
|
ard ARD
|
|
sid SID
|
|
del DEL
|
|
ftx FTX
|
|
)
|
|
|
|
lab.Unb.Print()
|
|
lab.Unh.Print()
|
|
lab.Mid.Print()
|
|
lab.Sdt.Print()
|
|
lab.Bdt.Print()
|
|
lab.Csg.Print()
|
|
for _, ard = range lab.ArdList {
|
|
ard.Print()
|
|
ard.Pdi.Print()
|
|
ard.Sad.Print()
|
|
ard.Dst.Print()
|
|
ard.Pdn.Print()
|
|
for _, sid = range ard.SidList {
|
|
sid.Print()
|
|
}
|
|
for _, del = range ard.DelList {
|
|
del.Print()
|
|
}
|
|
ard.Adi.Print()
|
|
}
|
|
for _, ftx = range lab.FtxList {
|
|
ftx.Print()
|
|
}
|
|
lab.Unt.Print()
|
|
lab.Unz.Print()
|
|
}
|