1. 程式人生 > 其它 >go 生成器讀取csv檔案

go 生成器讀取csv檔案

package main

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

func readCsvYield(fPath string) chan map[string]string {
	var yield chan map[string]string
	yield = make(chan map[string]string)
	var resDict map[string]string
	resDict = make(map[string]string)
	go func() {
		file, err := os.Open(fPath)
		if err != nil {
			close(yield)
			fmt.Println(err)
		}
		defer file.Close()
		reader := csv.NewReader(file)
		totalRows := -1
		var keys []string
		for {
			row, err := reader.Read()
			if err != nil && err != io.EOF {
				fmt.Printf("can not read , err is %s", err)
				close(yield)
			}
			if err == io.EOF {
				close(yield)
				break
			}
			if totalRows == -1 {
				keys = append(keys, row...)
				totalRows += 1
				continue
			}
			for idx, item := range row {
				resDict[keys[idx]] = item
			}
			totalRows += 1
			yield <- resDict
			resDict = make(map[string]string)

		}

	}()
	return yield
}

func main() {
	//fileName := "/data/appdeploy/dwy/ent_info_base.csv"
	fileName := "D:\\tmp\\in.csv"
	for line := range readCsvYield(fileName) {
		fmt.Println(line)
	}

}