|
|
- package reorder
-
- import (
- "errors"
- "fmt"
- "io/ioutil"
- "os"
- "strings"
- )
-
- /** REORDER文件解析器,将REORDER文件解析成预定义的数据格式以便于后续的数据处理 **/
- // 解析REORDER文件
- func ParseReorderEdi(ediFile string, reorder *REORDER)(err error){
- var(
- f *os.File
- fd []byte
- datalist []string
- row string
- rowObj string
- ilen, jlen int
- seq SEQ
- gir GIR
- lin LIN
- pia PIA
- qty QTY
- )
- // 打开文件
- 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对象
- reorder.DataRows = 0
- fmt.Println("Total data row = ",len(datalist))
- for _, row = range datalist {
- if strings.TrimSpace(row) == "" {
- continue
- }
- rowObj = getReorderDataRowObj(row)
- switch rowObj{
- case "UNB":
- if err = reorder.Unb.Parse(row); err != nil {
- goto ERR
- }
- case "UNH":
- if err = reorder.Unh.Parse(row); err != nil {
- goto ERR
- }
- reorder.DataRows++
- case "BGM":
- if err = reorder.Bgm.Parse(row); err != nil {
- goto ERR
- }
- reorder.DataRows++
- case "DTM":
- if err = reorder.Dtm.Parse(row); err != nil {
- goto ERR
- }
- reorder.DataRows++
- case "RFF":
- if err = reorder.Rff.Parse(row); err != nil {
- goto ERR
- }
- reorder.DataRows++
- case "NAD":
- if err = reorder.Nad.Parse(row); err != nil {
- goto ERR
- }
- reorder.DataRows++
- case "FTX":
- if err = reorder.Ftx.Parse(row); err != nil {
- goto ERR
- }
- reorder.DataRows++
- case "SEQ":
- seq = SEQ{}
- if err = seq.Parse(row); err != nil {
- goto ERR
- }
- reorder.SeqList = append(reorder.SeqList, seq)
- reorder.DataRows++
- case "GIR":
- gir = GIR{}
- if err = gir.Parse(row); err != nil {
- goto ERR
- }
- ilen = len(reorder.SeqList)
- if ilen < 1 {
- err = errors.New("SEQ gir is existed before the 1st SEQ!")
- goto ERR
- }
- reorder.SeqList[ilen-1].Gir = gir
- reorder.DataRows++
- case "LIN":
- lin = LIN{}
- if err = lin.Parse(row); err != nil {
- goto ERR
- }
- ilen = len(reorder.SeqList)
- if ilen < 1 {
- err = errors.New("SEQ lin is existed before the 1st SEQ!")
- goto ERR
- }
- reorder.SeqList[ilen-1].LinList = append(reorder.SeqList[ilen-1].LinList, lin)
- reorder.DataRows++
- case "PIA":
- pia = PIA{}
- if err = pia.Parse(row); err != nil {
- goto ERR
- }
- ilen = len(reorder.SeqList)
- if ilen < 1 {
- err = errors.New("SEQ pia is existed before the 1st SEQ!")
- goto ERR
- }
- jlen = len(reorder.SeqList[ilen-1].LinList)
- if jlen < 1 {
- err = errors.New("SEQ pia is existed before the 1st LIN!")
- goto ERR
- }
- reorder.SeqList[ilen-1].LinList[jlen-1].Pia = pia
- reorder.DataRows++
- case "QTY":
- qty = QTY{}
- if err = qty.Parse(row); err != nil {
- goto ERR
- }
- ilen = len(reorder.SeqList)
- if ilen < 1 {
- err = errors.New("SEQ qty is existed before the 1st SEQ!")
- goto ERR
- }
- jlen = len(reorder.SeqList[ilen-1].LinList)
- if jlen < 1 {
- err = errors.New("SEQ qty is existed before the 1st LIN!")
- goto ERR
- }
- reorder.SeqList[ilen-1].LinList[jlen-1].Qty = qty
- reorder.DataRows++
- case "UNT":
- reorder.Unt = UNT{}
- if err = reorder.Unt.Parse(row); err != nil {
- goto ERR
- }
- reorder.DataRows++
- case "UNZ":
- reorder.Unz = UNZ{}
- if err = reorder.Unz.Parse(row); err != nil {
- goto ERR
- }
- break
- default:
- err = errors.New("Unknown TOD object : "+rowObj)
- goto ERR
- }
- }
-
- if reorder.Unt.DataRows != reorder.DataRows {
- err = errors.New(fmt.Sprintf("Unt datarows: %d is not matching the actual datarows: %d", reorder.Unt.DataRows, reorder.DataRows))
- goto ERR
- }
-
- ERR:
- fmt.Println(err)
- return
- }
-
- func getReorderDataRowObj(row string)( obj string){
- if len(row) < 3 {
- return ""
- }
- return strings.ToUpper(row[:3])
- }
-
- // 打印解析的REORDER对象
- func PrintReorderEdi(reorder *REORDER){
- var(
- seq SEQ
- lin LIN
- )
-
- reorder.Unb.Print()
- reorder.Unh.Print()
- reorder.Bgm.Print()
- reorder.Dtm.Print()
- reorder.Rff.Print()
- reorder.Nad.Print()
- reorder.Ftx.Print()
- for _, seq = range reorder.SeqList {
- seq.Print()
- seq.Gir.Print()
- for _, lin = range seq.LinList {
- lin.Print()
- }
- }
- reorder.Unt.Print()
- reorder.Unz.Print()
- }
|