tpphu / golang-training

Golang for Backend Developer with Nordic Coder
https://nordiccoder.com/khoa-hoc/golang-for-backend-dev/
131 stars 50 forks source link

Convert CSV To YAM #14

Closed tpphu closed 5 years ago

tpphu commented 5 years ago

Cho các bạn một file, mô tả cấu trúc tỉnh thành,quận huyện,phường xã như bên dưới

RegionId,RegionName,DistrictId,DistrictName,WardId,WardName
1,Hồ Chí Minh,1,Quận 1,26734,Phường Tân Định
1,Hồ Chí Minh,1,Quận 1,26737,Phường Đa Kao
1,Hồ Chí Minh,1,Quận 1,26740,Phường Bến Nghé
1,Hồ Chí Minh,1,Quận 1,26743,Phường Bến Thành
1,Hồ Chí Minh,1,Quận 1,26746,Phường Nguyễn Thái Bình
1,Hồ Chí Minh,1,Quận 1,26749,Phường Phạm Ngũ Lão
1,Hồ Chí Minh,1,Quận 1,26752,Phường Cầu Ông Lãnh
1,Hồ Chí Minh,1,Quận 1,26755,Phường Cô Giang

Hãy chuyển sang file yaml với format như sau:

- id: 1
  name: Hồ Chí Minh
  districts:
  - id: 1
    name: Quận 1
    wards:
    - id: 26734
      name: Phường Tân Định
    - id: 26737
      name: Phường Đa Kao
    - id: 26740
      name: Phường Bến Nghé
    - id: 26743
      name: Phường Bến Thành
    - id: 26746
      name: Phường Nguyễn Thái Bình
    - id: 26749
      name: Phường Phạm Ngũ Lão
    - id: 26752
      name: Phường Cầu Ông Lãnh
    - id: 26755
      name: Phường Cô Giang
hiepndd commented 5 years ago

Da em submit bai a @tpphu oi

package main

import (
    "encoding/csv"
    "fmt"
    "io/ioutil"
    "log"
    "os"
)

// CityInfo is save info of city
type CityInfo struct {
    regionID     string
    regionName   string
    districtID   string
    districtName string
    wardID       string
    wardName     string
}

func main() {
    csvfile, err := os.Open("input.csv")
    list := []CityInfo{}
    if err != nil {
        log.Fatal("Couldn't open the csv file")
    }

    r, err := csv.NewReader(csvfile).ReadAll()
    if err != nil {
        panic(err)
    }
    for _, line := range r {
        data := CityInfo{
            regionID:     line[0],
            regionName:   line[1],
            districtID:   line[2],
            districtName: line[3],
            wardID:       line[4],
            wardName:     line[5],
        }
        list = append(list, data)
    }

    result := ""
    result += "- id: " + list[1].regionID + "\n"
    result += "  name: " + list[1].regionName + "\n"
    result += "  districts:\n"
    result += "  - id: " + list[1].districtID + "\n"
    result += "    name: " + list[1].districtName + "\n"
    result += "    ward:" + "\n"
    for i := 1; i < len(list); i++ {
        result += "    - id: " + list[i].wardID + "\n"
        result += "    - name: " + list[i].wardName + "\n"
    }

    myData := []byte(result)
    er := ioutil.WriteFile("conf.yaml", myData, 0777)
    if er != nil {
        fmt.Println(er)
    }

}
tpphu commented 5 years ago

Mình hem có muốn duplicate tỉnh thành, và quận huyện nha em :)

hiepndd commented 5 years ago

Dạ a @tpphu ơi , anh có thể cho em 1 ví dụ được không ạ

tpphu commented 5 years ago

Ý của anh là từ flat table thành cái nested thôi. Tức là trong 1 tỉnh có nhiều huyện, trong mỗi huyện có nhiều phường xã.