package main import ( "encoding/json" "fmt" "io/fs" "os" "path/filepath" "strings" ) func main() { dir := "D:\\Workspace\\f1\\server-feat\\etc\\data_map\\s1" filepath.Walk(dir, func(path string, info fs.FileInfo, err error) error { if err != nil { fmt.Printf("walk error: %v\n", err) return err } if info.IsDir() { return nil } if filepath.Ext(info.Name()) != ".json" { return nil } fmt.Printf("read file: %s\n", info.Name()) bytes, err := os.ReadFile(path) if err != nil { return err } var data mapAreaData if err := json.Unmarshal(bytes, &data); err != nil { return err } data.initTileData() f, err := os.OpenFile(strings.TrimSuffix(info.Name(), ".json")+".txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) if err != nil { return err } defer f.Close() fmt.Printf("write file: %s\n", info.Name()+".txt") for x, ys := range data.tileData { if x%2 == 1 { f.WriteString(" ") } for _, v := range ys { f.WriteString(fmt.Sprintf("%d ", v)) } f.WriteString("\n") } fmt.Println(data.String()) return nil }) } type ( point struct { X int32 `json:"x"` Y int32 `json:"y"` } mapAreaData struct { Name string `json:"name"` Width int32 `json:"width"` Height int32 `json:"height"` LeftUp point `json:"leftUp"` RightDown point `json:"rightDown"` MapData []int32 `json:"mapdata"` tileData [][]int32 } ) func (p *mapAreaData) String() string { return fmt.Sprintf("MapAreaData(Name:%s, Width:%d, Height:%d, LeftUp:%s, RightDown:%s)", p.Name, p.Width, p.Height, p.LeftUp.String(), p.RightDown.String()) } func (p *mapAreaData) initTileData() { p.tileData = make([][]int32, p.Width) for i := range p.tileData { p.tileData[i] = make([]int32, p.Height) } for x := range p.Width { for y := range p.Height { p.tileData[x][y] = p.MapData[y*p.Width+x] } } } func (p *point) String() string { return fmt.Sprintf("Point(%d, %d)", p.X, p.Y) }