decode.go 2.9 KB
Newer Older
aaronchen2k2k's avatar
aaronchen2k2k 已提交
1 2 3 4 5 6 7 8 9
package gen

import (
	"encoding/json"
	"github.com/easysoft/zendata/src/model"
	fileUtils "github.com/easysoft/zendata/src/utils/file"
	i118Utils "github.com/easysoft/zendata/src/utils/i118"
	logUtils "github.com/easysoft/zendata/src/utils/log"
	"github.com/easysoft/zendata/src/utils/vari"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
10 11
	"os"
	"path/filepath"
aaronchen2k2k's avatar
aaronchen2k2k 已提交
12 13 14 15 16 17 18 19
	"strings"
)

const (

)

func Decode(defaultFile, configFile, fieldsToExportStr, input, output string) {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
20 21 22 23 24 25 26
	if output != "" {
		fileUtils.MkDirIfNeeded(filepath.Dir(output))
		fileUtils.RemoveExist(output)
		logUtils.FileWriter, _ = os.OpenFile(output, os.O_RDWR|os.O_CREATE, 0777)
		defer logUtils.FileWriter.Close()
	}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
27 28 29 30 31
	vari.DefaultDir = fileUtils.GetAbsDir(defaultFile)
	vari.ConfigDir = fileUtils.GetAbsDir(configFile)

	vari.Total = 10

aaronchen2k2k's avatar
aaronchen2k2k 已提交
32 33 34 35 36 37 38 39 40 41
	fieldsToExport := make([]string, 0)
	if fieldsToExportStr != "" {
		fieldsToExport = strings.Split(fieldsToExportStr, ",")
	}

	vari.Def = LoadConfigDef(defaultFile, configFile, &fieldsToExport)
	vari.Res = LoadResDef(fieldsToExport)

	data := fileUtils.ReadFile(input)

aaronchen2k2k's avatar
aaronchen2k2k 已提交
42
	var ret  []map[string]interface{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
43 44
	LinesToMap(data, fieldsToExport, &ret)
	jsonObj, _ := json.Marshal(ret)
45
	vari.JsonResp = string(jsonObj)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
46

aaronchen2k2k's avatar
aaronchen2k2k 已提交
47
	logUtils.PrintTo(i118Utils.I118Prt.Sprintf("analyse_success", output ))
aaronchen2k2k's avatar
aaronchen2k2k 已提交
48
	logUtils.PrintLine(vari.JsonResp)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
49 50 51 52 53 54 55 56 57 58 59 60 61
}

func LinesToMap(str string, fieldsToExport []string, ret *[]map[string]interface{}) {
	start := 0
	if vari.WithHead {
		start = 1
	}

	for index, line := range strings.Split(str, "\n") {
		if index < start {
			continue
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
62 63
		rowMap := map[string]interface{}{}
		decodeOneLevel(line, vari.Def.Fields, &rowMap)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
64 65 66 67 68
		*ret = append(*ret, rowMap)
	}
	return
}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
69 70
func decodeOneLevel(line string, fields []model.DefField, rowMap *map[string]interface{}) () {

aaronchen2k2k's avatar
aaronchen2k2k 已提交
71 72 73 74
	left := []rune(line)

	for j, field := range fields {
		col := ""
aaronchen2k2k's avatar
aaronchen2k2k 已提交
75

aaronchen2k2k's avatar
aaronchen2k2k 已提交
76 77 78 79 80
		if field.Width > 0 {
			col = string(left[:field.Width])
			left = left[field.Width:]
		} else {
			sepStr := ""
aaronchen2k2k's avatar
aaronchen2k2k 已提交
81 82
			if j < len(fields) - 1 {
				sepStr = field.Postfix + fields[j+1].Prefix
aaronchen2k2k's avatar
aaronchen2k2k 已提交
83 84 85 86 87 88 89 90
			} else {
				sepStr = field.Postfix
			}
			sep := []rune(sepStr)

			if len(sep) > 0 {
				index := searchRune(left, sep)
				if index > -1 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
91 92
					col = string(left[: index + len(field.Postfix)])
					left = left[index + len(field.Postfix):]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
93
				}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
94 95 96
			} else if j == len(fields) - 1 {
				col = string(left)
				left = []rune{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
97 98 99
			}
		}

aaronchen2k2k's avatar
aaronchen2k2k 已提交
100 101 102 103
		(*rowMap)[field.Field] = col

		children := field.Fields
		if len(children) > 0 {
aaronchen2k2k's avatar
aaronchen2k2k 已提交
104 105
			//colWithoutFix := col[runewidth.StringWidth(field.Postfix):
			//	runewidth.StringWidth(col) - runewidth.StringWidth(field.Postfix)]
aaronchen2k2k's avatar
aaronchen2k2k 已提交
106 107

			rowMapChild := map[string]interface{}{}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
108
			decodeOneLevel(col, children, &rowMapChild)
aaronchen2k2k's avatar
aaronchen2k2k 已提交
109 110 111

			(*rowMap)[field.Field + ".fields"] = rowMapChild
		}
aaronchen2k2k's avatar
aaronchen2k2k 已提交
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
	}

	return
}

func searchRune(text []rune, what []rune) int {
	for i := range text {
		found := true
		for j := range what {
			if i+j < len(text) && text[i+j] != what[j] {
				found = false
				break
			}
		}
		if found {
			return i
		}
	}
	return -1
}