Golang為別人寫的csv檔案處理的例子

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
package mainimport (    "encoding/csv"    "flag"    "io"    "log"    "os"    "sort"    "strings")var quick, first, unrepeat boolfunc main() {    path := flag.String("p", "", "-p 指定csv檔案路徑")    logname := flag.String("l", "", "-l 指定結果輸出路徑,不指定則輸出到標準輸出")    flag.BoolVar(&quick, "q", false, "-q 資料全部載入到記憶體中處理,預設是少量資料載入到記憶體操作,bool值")    flag.BoolVar(&first, "f", false, "-f 使用首次遇到的一條資料,預設是使用最後遇到的一條資料,bool值")    flag.BoolVar(&unrepeat, "u", false, "-u 預設是使用重複資料,bool值")    flag.Parse()    if *logname != "" {        File, err := os.Create(*logname)        if err != nil {            log.Println("建立輸出檔案失敗:", err.Error())            return        }        log.SetOutput(File)    }    if *path == "" {        flag.Usage()        return    }    Read(*path)}func Read(path string) {    File, err := os.Open(path)    if err != nil {        log.Println("讀取csv檔案失敗,錯誤資訊:", err.Error())        return    }    defer File.Close()    csvr := csv.NewReader(File)    if quick {        QMerge(csvr)    } else {        list := SMerge(csvr, File)        FromLineRead(list, path)    }}func QMerge(r *csv.Reader) {    var m = make(map[string][]string)    var list []string    var repeat []string    r.Read()    var err error    var key string    for {        list, err = r.Read()        if err != nil {            if err != io.EOF {                log.Println("讀取檔案內容失敗,錯誤資訊:", err.Error())            }            break        }        if len(list) != 5 {            log.Println("無效資料:", list)            continue        }        key = strings.TrimSpace(list[1] + list[3])        if key != "" {            if _, ok := m[key]; ok {                repeat = append(repeat, key)                if !first {                    m[key] = list                }            } else {                m[key] = list            }        }    }    for _, value := range repeat {        if unrepeat {            delete(m, value)        } else {            log.Println(m[value])        }    }    if unrepeat {        for _, value := range m {            log.Println(value)        }    }}func SMerge(r *csv.Reader, seek io.Seeker) []int {    var m = make(map[string]int)    var list []string    var repeat []string    r.Read()    var key string    var err error    var line int    for {        list, err = r.Read()        if err != nil {            if err != io.EOF {                log.Println("讀取檔案內容失敗,錯誤資訊:", err.Error())            }            break        }        if len(list) != 5 {            log.Println("無效資料:", list)            line++            continue        }        key = strings.TrimSpace(list[1] + list[3])        if key != "" {            if _, ok := m[key]; ok {                repeat = append(repeat, key)                if !first {                    m[key] = line                }            } else {                m[key] = line            }        }        line++    }    var lines = make([]int, 0, len(m))    for _, v := range repeat {        if unrepeat {            delete(m, v)        } else {            lines = append(lines, m[v])        }    }    if unrepeat {        for _, v := range m {            lines = append(lines, v)        }    }    sort.Ints(lines)    return lines}func FromLineRead(lines []int, path string) {    File, err := os.Open(path)    if err != nil {        log.Println("讀取csv檔案失敗:", err.Error())        return    }    defer File.Close()    r := csv.NewReader(File)    r.Read()    var list []string    var line, index int    for {        list, err = r.Read()        if err != nil {            if err != io.EOF {                log.Println("讀取檔案內容失敗,錯誤資訊:", err.Error())            }            break        }        if lines[index] == line {            log.Println(list)            index++            if index >= len(lines) {                break            }        }        line++    }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.